2012-10-25 3 views
4

jQuery Mobile 및 PhoneGap을 사용하여 사용자가 사진을 찍어 화면에서보고 나서 궁극적으로 웹 사이트에 게시 할 서버 응용 프로그램에 업로드 할 수있는 응용 프로그램을 만듭니다. .PhoneGap : 응용 프로그램이 인물 사진을 찍을 때 충돌이 발생합니다.

가로 모드에서 사진을 찍으면 잘 작동하지만 세로 사진을 찍으면 응용 프로그램이 깨집니다. 아래의 코드 조각에서 볼 수 있듯이 correctOrientation 매개 변수를 사용하여 촬영 한 후 사진의 방향을 잡으려고합니다. 이 매개 변수가 없으면 응용 프로그램이 충돌하지 않지만 사진이 표시 될 때 잘못된 방향으로 표시됩니다.

지금은 Sony XPERIA android phone에서 테스트 중입니다.

다음은 작업을 담당하는 코드입니다.

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) 

, 나는 사람이 정확한 문제가 표시되지 않습니다. 어떤 도움을 주신다면

답변

2

확실하게 스택 추적을보아야하지만 아마 OutOfMemoryException입니다. 안드로이드는 이미지 조작을 매우 나쁘게 처리합니다. 기본적으로 전체 이미지를 각 픽셀이 4 바이트 인 메모리에로드해야합니다. 즉, 많은 최신 휴대 전화 카메라의 경우 최대 40 메가 바이트를 의미합니다.

내 유일한 제안은 품질을 100으로 전환하는 것입니다. 반 직관적으로 들리지만 이미 백그라운드에서 처리되는 것을 막을 수 있습니다.

당신은 카메라와 함께 몇 가지 문제에 대해 이야기 내 블로그 게시물을 읽을 수 있습니다

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

을 또한, 나는 스택이 도움이 될 추적 볼 수있는 경우.

+0

고마워요,하지만 그 속임수를하지 않는 것 같습니다. 원래 메시지를 편집하여 스택 추적을 추가했습니다. –

+0

예, 메모리 부족 예외입니다. 적절한 방향으로 회전 할 수 있도록 이미지를 비트 맵에로드하면 너무 많은 메모리가 사용됩니다. –

+0

주위에 어떤 방법이 있습니까? targetWidth와 targetHeight를 지정하면 오리엔테이션을 시도하기 전에 이미지 크기를 줄이니? –

0

이 스레드는 약간 오래된 것이지만 문제는 아직 남아 있습니다. 나는 phonegap 플러그인 코드를 더 깊이 조사하고 있었고, Simon이 말했듯이, 안드로이드 클래스가 이미지 조작을 처리하지 않고 Bitmapfactory.decodeStream 메소드를 통해 큰 비트 맵을로드하는 문제가 있음을 알았다. 그러나 이미지 크기를 조정할 필요가 없다면 (예 : 갤러리에서 가져 와서 - 나중에 서버 측에서 할 수 있습니다.) 100 가지 품질을 유지하면서 correctOrientation 옵션과 대상을 사용할 필요가 없습니다. type은 FILE_URI입니다. 예를 들어, 어딘가에 업로드하려면 이미지 URI가 필요합니다. 예를 들어, 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에 대한 의견). 그 이유는 알지 못합니다.)

+0

아마도 우리는 사용 가능한 메모리와 카메라 해상도를 읽고 필요한 메모리 공간을 계산하고 그에 따라 이미지 크기를 조정해야합니다. –

관련 문제