Android PhoneGap:应用程序崩溃拍摄人像照片

Android PhoneGap:应用程序崩溃拍摄人像照片,android,cordova,jquery-mobile,Android,Cordova,Jquery Mobile,我正在使用jQuery Mobile和PhoneGap创建一个应用程序,允许用户拍摄照片,在屏幕上查看,然后将其上传到服务器应用程序,最终将其发布到网站上 如果我在横向模式下拍摄照片,效果会很好,但是当我拍摄肖像照片时,应用程序会崩溃。正如您从下面的代码片段中看到的,我正在使用correctOrientation参数尝试在照片拍摄后对其进行定向。如果没有此参数,应用程序不会崩溃,但是照片显示时方向错误 现在我正在Sony XPERIA android手机上测试 这是负责这项工作的代码 funct

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

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

现在我正在Sony XPERIA android手机上测试

这是负责这项工作的代码

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)

我做了一些搜索,我没有看到任何人有这个确切的问题。非常感谢任何帮助

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

我现在唯一的建议是试着把质量调到100。我知道这听起来有悖常理,但这会让你避免在后台进行太多的处理

您可以阅读我的博客文章,其中谈到了相机的一些问题:


另外,如果我能看到堆栈跟踪,它会有所帮助。

此线程可能有点旧,但问题仍然存在。我一直在深入研究phonegap插件代码,并注意到问题在于,正如Simon所说,Android类没有处理图像操作->通过Bitmapfactory.decodeStream方法加载大位图。但是,如果您不需要调整图像的大小(从gallery->获取图像时,您可以稍后再进行调整,例如在服务器端),并且您希望保留100质量,并且不需要使用correctOrientation选项,并且您的目标类型是FILE\u URI。。简单地说,您只需要将图像URI上载到某个位置,例如,然后需要包括3个选项:targetWidth设置为-1,targetEight设置为-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});

您可以在(cordova 2.8.0第394行的评论)中找到有关该信息。不知道为什么文档中没有;)

谢谢,但这似乎不管用。我编辑了原始消息以添加堆栈跟踪。是的,这是一个内存不足的异常。将图像加载到位图中以便将其旋转到正确的方向会占用太多内存。有没有办法解决这个问题?如果我指定targetWidth和targetLight,这会在图像尝试定向之前缩小图像吗?是的,它会将图像的缩放版本加载到位图中,这将使用更少的内存。非常好。这就成功了。我把质量改回了50,把targetLight,targetWidth改回了800。这是一个非常显著的文件大小差异,从大约一兆降至大约25K!我将调整这些值以获得最佳质量和内存使用率。谢谢。也许我们应该读取可用的内存和相机分辨率,计算(大致)所需的内存空间,并相应地调整图像大小-有同样的问题,只是一个想法