Phonegap camera failure when retrieving data

2019-06-19 01:39发布

问题:

--------------- UPDATE ---------------

Seems that there´s some kind of problem with HTC Desire camera and this version of Phonegap. The issue seems to be the way HTC returns the camera specs on Android.

--------------- UPDATE ---------------

I´ve been using phonegap to rewrite the code of my previous application but not I need to use the camera API. When I used it on a real phone it crashed after taking the photo and i got this error with SendLog.

10-07 09:44:46.980 D/AndroidRuntime( 1626): Shutting down VM
10-07 09:44:46.980 W/dalvikvm( 1626): threadid=1: thread exiting with uncaught exception (group=0x400259f8)
10-07 09:44:46.989 W/CameraThread( 1159): Release Camera - set mIsLastCameraClosed to true
10-07 09:44:46.989 W/CameraThread( 1159): CameraHandler Message - CLOSE_CAMERA end
10-07 09:44:46.989 E/AndroidRuntime( 1626): FATAL EXCEPTION: main
10-07 09:44:46.989 E/AndroidRuntime( 1626): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=33, result=-1, data=Intent { act=inline-data (has extras) }} to activity {com.theinit.example/com.theinit.example.TestPhoneGapActivity}: java.lang.NullPointerException
10-07 09:44:46.989 E/AndroidRuntime( 1626):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3734)
10-07 09:44:46.989 E/AndroidRuntime( 1626):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3776)
10-07 09:44:46.989 E/AndroidRuntime( 1626):     at android.app.ActivityThread.access$2800(ActivityThread.java:135)
10-07 09:44:46.989 E/AndroidRuntime( 1626):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2166)
10-07 09:44:46.989 E/AndroidRuntime( 1626):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-07 09:44:46.989 E/AndroidRuntime( 1626):     at android.os.Looper.loop(Looper.java:144)
10-07 09:44:46.989 E/AndroidRuntime( 1626):     at android.app.ActivityThread.main(ActivityThread.java:4937)
10-07 09:44:46.989 E/AndroidRuntime( 1626):     at java.lang.reflect.Method.invokeNative(Native Method)
10-07 09:44:46.989 E/AndroidRuntime( 1626):     at java.lang.reflect.Method.invoke(Method.java:521)
10-07 09:44:46.989 E/AndroidRuntime( 1626):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
10-07 09:44:46.989 E/AndroidRuntime( 1626):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
10-07 09:44:46.989 E/AndroidRuntime( 1626):     at dalvik.system.NativeStart.main(Native Method)
10-07 09:44:46.989 E/AndroidRuntime( 1626): Caused by: java.lang.NullPointerException
10-07 09:44:46.989 E/AndroidRuntime( 1626):     at android.content.ContentResolver.openInputStream(ContentResolver.java:286)
10-07 09:44:46.989 E/AndroidRuntime( 1626):     at com.phonegap.CameraLauncher.onActivityResult(CameraLauncher.java:248)
10-07 09:44:46.989 E/AndroidRuntime( 1626):     at com.phonegap.DroidGap.onActivityResult(DroidGap.java:1346)
10-07 09:44:46.989 E/AndroidRuntime( 1626):     at android.app.Activity.dispatchActivityResult(Activity.java:3931)
10-07 09:44:46.989 E/AndroidRuntime( 1626):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3730)
10-07 09:44:46.989 E/AndroidRuntime( 1626):     ... 11 more

Does anyone know why this happens?

This is my Camera.js

This is my Camera.js

var options = { quality : 75, 
      destinationType : Camera.DestinationType.DATA_URL, 
      sourceType : Camera.PictureSourceType.CAMERA, 
      allowEdit : true,
      targetWidth: 100,
      targetHeight: 100 };

function capturePhoto() {
    // Take picture using device camera and retrieve image as base64-encoded string
    navigator.camera.getPicture(onPhotoDataSuccess, onFail, options);
}

function onPhotoDataSuccess() {
    // Uncomment to view the base64 encoded image data
    var theHTML = '';
    theHTML = '<div id="info">CameraSuccess</div>';
    document.getElementById('main').innerHTML = theHTML;
}

function onFail(message) {
    // Called if something bad happens. 
    alert('Failed because: ' + message);
}

Hope it helps

Thanks all by the way

回答1:

I just helped a person with the same error on the PhoneGap issue list. I believe you are missing the permission:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

from your AndroidManifest.xml file. We need to be able the write the captured image out to a .jpg file.



回答2:

I had the same problem when I set my minSdkVersion within the AndroidManifest.xml to 7. I don't experience this problem when I use minSdkVersion="2".



回答3:

--------------- UPDATE ---------------

Seems that there´s some kind of problem with HTC Desire camera and this version of Phonegap. The issue seems to be the way HTC returns the camera specs on Android.

--------------- UPDATE ---------------

This code works fine for me, I've got only the .js reference to this code on the index and a button with the capturePhoto() function.

Hope it helps to anyone fix their problems.

var pictureSource;   // picture source
var destinationType; // sets the format of returned value 

// Wait for PhoneGap to connect with the device
//
document.addEventListener("deviceready",onDeviceReady,false);

// PhoneGap is ready to be used!
//
function onDeviceReady() {
    pictureSource=navigator.camera.PictureSourceType;
    destinationType=navigator.camera.DestinationType;
}

// Called when a photo is successfully retrieved
//
function onPhotoDataSuccess(imageData) {
  // Uncomment to view the base64 encoded image data
  // console.log(imageData);

  // Get image handle
  //
  var smallImage = document.getElementById('smallImage');

  // Unhide image elements
  //
  smallImage.style.display = 'block';

  // Show the captured photo
  // The inline CSS rules are used to resize the image
  //
  smallImage.src = "data:image/jpeg;base64," + imageData;
}

// Called when a photo is successfully retrieved
//
function onPhotoURISuccess(imageURI) {
  // Uncomment to view the image file URI 
  // console.log(imageURI);

  // Get image handle
  //
  var largeImage = document.getElementById('largeImage');

  // Unhide image elements
  //
  largeImage.style.display = 'block';

  // Show the captured photo
  // The inline CSS rules are used to resize the image
  //
  largeImage.src = imageURI;
}

// A button will call this function
//
function capturePhoto() {
  // Take picture using device camera and retrieve image as base64-encoded string
  navigator.camera.getPicture(onPhotoDataSuccess, onFail, { quality: 50 });
}

// A button will call this function
//
function capturePhotoEdit() {
  // Take picture using device camera, allow edit, and retrieve image as base64-encoded string  
  navigator.camera.getPicture(onPhotoDataSuccess, onFail, { quality: 20, allowEdit: true }); 
}

// A button will call this function
//
function getPhoto(source) {
  // Retrieve image file location from specified source
  navigator.camera.getPicture(onPhotoURISuccess, onFail, { quality: 50, 
    destinationType: destinationType.FILE_URI,
    sourceType: source });
}

// Called if something bad happens.
// 
function onFail(message) {
  alert('Failed because: ' + message);
}


回答4:

EDIT

Originally I had thought that clearing my application on my phone and re-installing it had fixed the issue. It turns out this wasn't the case. I found out that there is an issue where the PhoneGap app is removed with the Android Garbage Collection when trying to grab an image from the camera. After searching for hours the solution I ended up going with was using the foreground camera plugin. This plugin creates its own camera inside of the application itself this way you don't have to worry about garbage collection picking it up.

Unfortunately, it's not fully featured and the most of the camera options aren't available to the user. It also only supports Cordova 2.4.0 which means I had to downgrade from 2.7.0. This solution will work for my current application, hopefully by the next one I write there will be a better solution. Hope this helps someone!