我正在使用jQuery Mobile和PhoneGap创建一个应用程序,允许用户拍照,在屏幕上查看,然后将其上传到服务器应用程序,最终将其发布到网站上。
如果我在横向模式下拍摄照片,但在拍摄人像照片时会崩溃应用程序,效果很好。正如您从下面的代码片段中看到的那样,我使用了correctOrientation参数来尝试在拍摄照片后定位照片。如果没有此参数,应用程序不会崩溃,但是当照片显示时,照片的方向是错误的。
现在我正在索尼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)
我已经做了一些搜索,我没有看到任何人有这个问题。任何帮助表示赞赏
答案 0 :(得分:2)
我必须看到你的堆栈跟踪,但它可能是一个OutOfMemoryException。 Android非常糟糕地处理图像处理。它基本上需要将整个图像加载到每个像素为4个字节的内存中,这对于许多现代手机摄像头来说意味着高达40兆字节。
我现在唯一的建议是尝试将质量切换为100.我知道这听起来有点违反直觉,但它可以避免在后台进行同样多的处理。
您可以阅读我的博客文章,谈论相机的一些问题:
http://simonmacdonald.blogspot.ca/2012/07/change-to-camera-code-in-phonegap-190.html
另外,如果我能看到堆栈跟踪,它会有所帮助。
答案 1 :(得分:0)
这个帖子可能有点旧,但问题仍然存在。我一直在深入研究phonegap插件代码,并注意到问题是,正如Simon所说,Android类没有处理图像操作 - >通过Bitmapfactory.decodeStream方法加载一个大位图。但是,如果您不需要调整图像的大小(从图库中获取它 - >您可以稍后在服务器端执行此操作)并且您希望保留100质量并且您不需要使用correctOrientation选项并且您的目的地类型是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});
您可以在plugins code中找到相关信息(第394行,cordova 2.8.0)。不知道为什么它不在文档中;)