4

我正在使用 jQuery Mobile 和 PhoneGap 创建一个应用程序,该应用程序允许用户拍照、在屏幕上查看它,然后将其上传到最终将其发布到网站上的服务器应用程序。

如果我在横向模式下拍摄照片效果很好,但是当我拍摄纵向照片时应用程序会崩溃。正如您从下面的代码片段中看到的那样,我正在使用正确的Orientation 参数来尝试在拍摄照片后对其进行定向。如果没有这个参数,应用程序不会崩溃,但是照片在显示时的方向是错误的。

现在我正在索尼 XPERIA 安卓手机上测试这个。

这是负责这项工作的代码。

function onPhotoFail(message) {
    alert('Failed because: ' + message);
}

function onPhotoSuccess(imageURI) {             
    var $image = $("img#upload-image");
$image.attr("src", imageURI);
}

function capturePhoto() {
navigator.camera.getPicture(onPhotoSuccess, onPhotoFail, { quality: 50, destinationType: Camera.DestinationType.FILE_URI , correctOrientation: true });     
}

这是堆栈跟踪:

E/AndroidRuntime(31760): FATAL EXCEPTION: main
E/AndroidRuntime(31760): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
E/AndroidRuntime(31760):        at android.graphics.Bitmap.nativeCreate(Native Method)
E/AndroidRuntime(31760):        at android.graphics.Bitmap.createBitmap(Bitmap.java:477)
E/AndroidRuntime(31760):        at android.graphics.Bitmap.createBitmap(Bitmap.java:444)
E/AndroidRuntime(31760):        at org.apache.cordova.CameraLauncher.getRotatedBitmap(CameraLauncher.java:483)
E/AndroidRuntime(31760):        at org.apache.cordova.CameraLauncher.onActivityResult(CameraLauncher.java:326)
E/AndroidRuntime(31760):        at org.apache.cordova.DroidGap.onActivityResult(DroidGap.java:823)
E/AndroidRuntime(31760):        at android.app.Activity.dispatchActivityResult(Activity.java:3908)
E/AndroidRuntime(31760):        at android.app.ActivityThread.deliverResults(ActivityThread.java:2549)
E/AndroidRuntime(31760):        at android.app.ActivityThread.handleSendResult(ActivityThread.java:2595)
E/AndroidRuntime(31760):        at android.app.ActivityThread.access$2000(ActivityThread.java:121)
E/AndroidRuntime(31760):        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:973)
E/AndroidRuntime(31760):        at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(31760):        at android.os.Looper.loop(Looper.java:130)
E/AndroidRuntime(31760):        at android.app.ActivityThread.main(ActivityThread.java:3701)
E/AndroidRuntime(31760):        at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(31760):        at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime(31760):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
E/AndroidRuntime(31760):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624)
E/AndroidRuntime(31760):        at dalvik.system.NativeStart.main(Native Method)

我已经做了一些搜索,我没有看到有人遇到这个确切的问题。任何帮助表示赞赏

4

2 回答 2

2

我必须查看您的堆栈跟踪才能确定,但​​这可能是 OutOfMemoryException。Android 处理图像处理非常糟糕。它基本上需要将整个图像加载到每个像素为 4 字节的内存中,这对于许多现代手机摄像头来说意味着高达 40 兆字节。

我现在唯一的建议是尝试将质量切换到 100。我知道这听起来违反直觉,但它可以避免在后台进行尽可能多的处理。

您可以阅读我的博客文章,讨论相机的一些问题:

http://simonmacdonald.blogspot.ca/2012/07/change-to-camera-code-in-phonegap-190.html

另外,如果我可以看到堆栈跟踪,那将有所帮助。

于 2012-10-25T13:25:07.470 回答
0

这个线程可能有点旧,但问题仍然存在。我一直在更深入地研究 phonegap 插件代码,并注意到问题在于,正如 Simon 所说,Android 类不处理图像操作-> 通过 Bitmapfactory.decodeStream 方法加载大位图。但是,如果您不需要调整图像大小(从图库中获取图像时 -> 您可以稍后在服务器端进行)并且您想要保持 100 质量并且您不需要使用正确的方向选项和您的目的地类型是 FILE_URI.. 简单地说,您只需要将图像 URI 上传到某处,例如,然后您需要包含 3 个选项:targetWidth 设置为 -1,targetHeight 设置为 -1,correctOrientation 设置为 false:

    navigator.camera.getPicture(cameraSuccess, cameraError, { quality: 100, targetWidth: -1, 
                    targetHeight: -1, correctOrientation: false,
                    destinationType: navigator.camera.DestinationType.FILE_URI,
                    sourceType: navigator.camera.PictureSourceType.SAVEDPHOTOALBUM});

您可以在插件代码中找到相关信息(第 394 行评论,cordova 2.8.0)。不知道为什么它不在文档中;)

于 2013-06-17T13:19:51.477 回答