【问题标题】:NativeScript Camera takePicture method not returning promise in Android (but does in iOS)NativeScript Camera takePicture 方法在 Android 中不返回承诺(但在 iOS 中)
【发布时间】:2017-04-28 12:22:29
【问题描述】:

运行测试相机示例see nativesript-camera repo,在 iOS 模拟器中一切正常,图像(从图库中选择)显示在屏幕上。但是,当我测试运行 Android 模拟器的相同代码时,在相机打开并拍摄照片并单击保存后,照片不会显示在屏幕上。所以我在 promise 应该返回之后添加了一个 console.log 来测试我得到了什么:

takePicture({width: 180, height: 180, keepAspectRatio: false, saveToGallery: saveToGallery}).
        then((imageAsset) => {
            console.log("IMAGE ASSET", imageAsset);
            let source = new imageSourceModule.ImageSource();
            source.fromAsset(imageAsset).then((source) => {
                console.log(`Size: ${source.width}x${source.height}`);
            });
            page.bindingContext.set("cameraImage", imageAsset);
        }, 
        (err) => {
            console.log("Error -> " + err.message);
        });

IMAGE ASSET 控制台日志永远不会在终端中显示,我什么意思。甚至我传递的字符串都没有,也没有错误。当我在 iOS 模拟器中运行应用程序时,console.log 确实显示在终端中,但在 Android 中什么也没有。我正在使用 Android Studio 虚拟设备(运行 Android 7.1 的 Nexus 5X)。

我尝试在线搜索以查看其他人是否遇到过此问题。找不到任何东西。有没有人遇到过这个问题并能够解决这个问题?

=== 更新 ===

所以我继续创建了一个新项目并在里面添加了 takePicture 方法。它现在正在返回承诺,但我在 Android 模拟器上收到以下错误:

An uncaught Exception occurred on "main" thread.
com.tns.NativeScriptException: 
Calling js method onScanCompleted failed

TypeError: trace.isEnabled is not a function
File: "file:///data/data/org.nativescript.cameraproject/files/app/tns_modules/nativescript-camera/nativescript-camera.js, line: 63, column: 50

StackTrace: 
    Frame: function:'onScanCompleted', file:'file:///data/data/org.nativescript.cameraproject/files/app/tns_modules/nativescript-camera/nativescript-camera.js', line: 63, column: 51


    at com.tns.Runtime.callJSMethodNative(Native Method)
    at com.tns.Runtime.access$2400(Runtime.java:33)
    at com.tns.Runtime$3.run(Runtime.java:1214)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

当我将 saveToGallery 设置为 false 时,错误消失了......

【问题讨论】:

  • 不,这对我有用,我用过很多次相机
  • 哦,哇,很高兴知道这一点。 @mast3rd3mon,相机示例适用于您在 Android 上吗?您可以拍摄照片并在屏幕上显示该照片吗?它仅适用于 iOS。您的代码结构是否不同?
  • 刚刚注意到别的东西。使用 Angular 的 nativescript-camera 示例在 Android 模拟器和设备上运行良好。这是不起作用的非 Angular 示例。
  • 由于原始问题已通过我提出的更改得到修复;您应该将其标记为已接受的答案并使用新问题创建一个新问题。通过这样做,您可能会混淆未来来这里的人......

标签: android camera nativescript


【解决方案1】:

我相信你有一个编码错误;

takePicture({width: 180, height: 180, keepAspectRatio: false, saveToGallery: saveToGallery}).
        then((imageAsset) => {
            console.log("IMAGE ASSET", imageAsset);
            let source = new imageSourceModule.ImageSource();
            source.fromAsset(imageAsset).then((source) => {
                console.log(`Size: ${source.width}x${source.height}`);
            });
            page.bindingContext.set("cameraImage", imageAsset);
        }, 
        (err) => {
            console.log("Error -> ",  err, err.stack);
        });

我很确定你的 error 例程会按照它的编写方式抛出一个错误,并且当它在一个 promise 的 catch 中抛出一个错误时,它会被默默地吃掉。

如果我猜到了根本原因,既然您提到了 Android 7,我会大胆猜测您的应用没有所需的权限。所以它抛出了一个错误,然后你的错误例程会抛出一个错误,使一切都消失了......


为您的新问题更新了答案

要使用 NativeScript-Camera v3.0.0,您必须使用 TNS 3.0.0 核心模块。如果要使用 TNS 核心模块 2.5.0(或之前),则需要使用 NativeScript-Camera v0.0.8 或更早版本...

【讨论】:

  • 嗯。我确实打电话给requestPermissions();,当我第一次启动应用程序时,它会请求许可,我同意了。另外,就抛出错误而言,即使发生了,是否应该将其记录到控制台?我没有将任何内容记录到控制台。
  • 你尝试过重写版本(我在上面发布):console.log("Error ->", err, err.stack) 看看是否报错
  • 不,如果您的源版本中的控制台像我认为的那样抛出错误,您将不会得到任何记录;看起来承诺不起作用或做任何事情。
  • 我确实尝试了您的错误 console.log 版本。我猜这就是问题所在,因为当我运行tns run ios 时,完全相同的代码工作得很好,这意味着(对于 iOS 模拟器),它允许我从图库中选择一个图像,然后在视图中显示它,但是当我使用相同的代码库运行tns run android 时,相机会打开,我可以拍摄照片,选择该照片,然后照片不会绑定到视图。在尝试在开发人员工具中进行调试时,我注意到由于某种原因,promise 没有返回资产。
  • 我也面临同样的问题。一旦我的应用更新,承诺不会返回
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
  • 2020-01-03
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多