NativeScript Camera takePicture方法未在Android中返回承诺(但在iOS中)

时间:2017-04-28 12:22:30

标签: android camera nativescript

运行测试相机示例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)。

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

=== UPDATE ===

所以我继续创建了一个新项目并在其中添加了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时错误消失了......

1 个答案:

答案 0 :(得分:0)

我相信你有编码错误;

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或更早版本...