Сбой камеры PhoneGap при получении данных - PullRequest
6 голосов
/ 13 октября 2011

--------------- ОБНОВЛЕНИЕ ---------------

Похоже, что есть проблема с камерой HTC Desire и этой версией Phonegap. Похоже, проблема в том, что HTC возвращает спецификации камеры на Android.

--------------- ОБНОВЛЕНИЕ ---------------

Я использовал phonegap, чтобы переписать код моего предыдущего приложения, но мне не нужно использовать API камеры. Когда я использовал его на реальном телефоне, он упал после съемки фотографии, и я получил эту ошибку с 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

Кто-нибудь знает, почему это происходит?

Это мой Camera.js

Это мой 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);
}

Надеюсь, это поможет

спасибо всем кстати

Ответы [ 4 ]

4 голосов
/ 23 ноября 2011

Я только что помог человеку с такой же ошибкой в ​​списке проблем PhoneGap.Я полагаю, что вам не хватает разрешения:

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

из файла AndroidManifest.xml.Нам нужно уметь записывать захваченное изображение в файл .jpg.

2 голосов
/ 20 декабря 2011

У меня была такая же проблема, когда я установил свой minSdkVersion в AndroidManifest.xml равным 7. У меня нет этой проблемы, когда я использую minSdkVersion = "2".

1 голос
/ 30 мая 2013

EDIT

Первоначально я думал, что очистка моего приложения на моем телефоне и его повторная установка устранили проблему. Оказывается, это был не тот случай. Я обнаружил, что существует проблема, при которой приложение PhoneGap удаляется с помощью Android Garbage Collection при попытке получить изображение с камеры. После долгих поисков решения, в котором я остановился, я использовал плагин для переднего плана камеры . Этот плагин создает собственную камеру внутри самого приложения, так что вам не нужно беспокоиться о том, что сборщик мусора поднимет его.

К сожалению, он не полностью доступен, и большинство параметров камеры недоступны для пользователя. Он также поддерживает только Cordova 2.4.0, что означает, что мне пришлось понизить версию с 2.7.0. Это решение будет работать для моего текущего приложения, надеюсь, к следующему, которое я напишу, будет лучшее решение. Надеюсь, это поможет кому-то!

1 голос
/ 23 ноября 2011

--------------- ОБНОВЛЕНИЕ ---------------

Кажетсячто есть какая-то проблема с камерой HTC Desire и этой версией Phonegap.Кажется, проблема в том, что HTC возвращает спецификации камеры на Android.

--------------- ОБНОВЛЕНИЕ ---------------

Этот код отлично работает для меня, у меня есть только ссылка .js на этот код в индексе и кнопка с функцией capturePhoto ().

Надеюсь, это поможет кому-то решить свои проблемы.

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...