Phonegap (3.0.0) Камера не удалась с первой попытки

В целях тестирования я скопировал полный пример, найденный в API камеры телефонной камеры, и я поставил предупреждение onPhotoDataSuccess для проверки, когда функция onPhotoDataSuccess . На первом снимке предупреждение не будет отображаться. Однако после первой попытки предупреждение будет показано после сохранения фотографии.

Любой совет? Я буду рад быть более конкретным, если что-то неясно.

Я проверил код ниже на моем Android Galaxy S3

  <!DOCTYPE html> <html> <head> <title>Capture Photo</title> <script type="text/javascript" charset="utf-8" src="cordova.js"></script> <script type="text/javascript" charset="utf-8"> var pictureSource; // picture source var destinationType; // sets the format of returned value // Wait for device API libraries to load // document.addEventListener("deviceready",onDeviceReady,false); // device APIs are available // 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, destinationType: destinationType.DATA_URL }); } // 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, destinationType: destinationType.DATA_URL }); } // 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); } </script> </head> <body> <button onclick="capturePhoto();">Capture Photo</button> <br> <button onclick="capturePhotoEdit();">Capture Editable Photo</button> <br> <button onclick="getPhoto(pictureSource.PHOTOLIBRARY);">From Photo Library</button><br> <button onclick="getPhoto(pictureSource.SAVEDPHOTOALBUM);">From Photo Album</button><br> <img style="display:none;width:60px;height:60px;" id="smallImage" src="" /> <img style="display:none;" id="largeImage" src="" /> </body> </html> 

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

Я тестировал его еще на одном фрагменте кода:

  (function () { $scroller = $('.scroller'), // Take a picture using the camera or select one from the library takePicture = function (e) { var options = { quality: 45, targetWidth: 1000, targetHeight: 1000, destinationType: Camera.DestinationType.FILE_URI, encodingType: Camera.EncodingType.JPEG, sourceType: Camera.PictureSourceType.CAMERA }; navigator.camera.getPicture( function (imageURI) { console.log(imageURI); alert('test'); $scroller.append('<img src="' + imageURI + '"/>'); }, function (message) { // We typically get here because the use canceled the photo operation. Fail silently. }, options); return false; }; $('.camera-btn').on('click', takePicture); }()); 

И это имеет тот же эффект. Он ничего не делает во время первой привязки, но он показывает изображение после второй привязки. Я также узнал, что картина, которая показывает после второго, – это первая фотография, которую я взял. Кажется, что первый аргумент в getPicture не срабатывает при первой привязке. Это расстраивает, так как logcat не показывает мне ничего, с чем можно было бы работать.

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

Я просто попробовал это на Phonegap Build, и он работает. Поэтому он должен иметь какое-то отношение к плагину …

Solutions Collecting From Web of "Phonegap (3.0.0) Камера не удалась с первой попытки"

Я не знаю, правильно ли это решение или нет, но его работа для меня идеально. Было бы тесто, чтобы проследить ваш лог-кот и найти точную проблему.

Попробуйте использовать navigator.camera.PictureSourceType установленный в pictureSource . Так выглядит

 <button onclick="getPhoto(navigator.camera.PictureSourceType.PHOTOLIBRARY);">From Photo Library</button><br> 

И аналогичным образом заменить в Javascript код, а также

 navigator.camera.getPicture(onPhotoDataSuccess, onFail, { quality: 50, destinationType: navigator.camera.DestinationType.FILE_URI }); 

ИЛИ

 navigator.camera.getPicture(onPhotoDataSuccess, onFail, { quality: 50, destinationType: navigator.camera.DestinationType.DATA_URI }); 

Обновление: попробуйте сохранить локацию corodova.js локально и позвонить из локального каталога, чтобы ваш каталог должен был понравиться

assets/www/js/cordova.js

 <script type="text/javascript" charset="utf-8" src="js/cordova.js"></script> 

Рабочий код

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

У меня была такая же проблема после обновления с 3.0.0 до 3.1.0. Отложенная камера, отсутствие геолокации и т. Д.

Посмотрите, есть ли в файловых platforms\android\cordova\version старая версия. Затем вам нужно обновить свою платформу. Итак, вот что я сделал.

  • Удалите все плагины: cordova plugin rm org.apache.cordova.camera
  • Удалите платформу: платформа cordova platform remove android (удалит изменения, внесенные вами в * .java-файлы)
  • Добавить платформу: cordova platform add android
  • Добавить все плагины: cordova plugin add org.apache.cordova.camera
  • Проверить разрешения
  • Построить это

Это похоже на создание нового проекта.

Имел точно такую ​​же проблему. Успех захвата получал только обратный вызов после того, как captureVideo был вызван во второй раз.

Просто заменил старый файл app / bin / cordova.jar новым 3.2.0 cordova-dev.jar (в eclispe) и все вернусь 🙂

У меня была эта точная проблема на Cordova 3.4.0, с новой установкой Кордовы (без обновления с предыдущей версии, как и некоторые другие). Перенос первого снимка ничего не принесет – никакого обратного вызова с успехом не будет. Взятие второго изображения приведет к успешному обратному вызову, но данные DATA_URL (изображение с кодировкой base64), которые вернулись, были данными с ПЕРВОГО изображения.

Для меня он работал нормально на одном телефоне, разных эмуляторах и т. Д., За исключением одного телефона Android 4.2, где он это делал. Решение заключалось в том, чтобы удалить приложение из телефона с помощью управления приложениями телефона в настройках, а затем переустановить приложение, а затем первое изображение вызовет обратный вызов успеха с его собственными данными.

Не знаю, почему, но удаление и переустановка приложения разрешили это для меня.

Я встретил ту же проблему и решил ее. Потому что вы импортируете два «cordova.js» в свое приложение, и, возможно, один из них находится в iframe. Вы можете вместо этого использовать «parent.cordova» в iframe.

У меня была эта проблема с Cordova 3.7.1 и Camera 0.3.5 – каждый раз, когда я вызывал плагин, он не возвращал изображение / путь, а при втором вызове возвращал ошибку «Отменен» для предыдущего вызова.

Проблема заключалась в том, что у моей основной деятельности был свой onActivityResult, который неправильно назвал метод супер.

 public class MainActivity extends CordovaActivity { //... @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == MyCustomActivity) { doMyCustomActivity(requestCode); } } //... } 

Чтобы исправить это, мне пришлось добавить ELSE, чтобы вызвать правильный обработчик:

 public class MainActivity extends CordovaActivity { //... @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == MyCustomActivity) { doMyCustomActivity(requestCode); } else { //this was missing - call other Activity of plugins super.onActivityResult(requestCode, resultCode, intent); } } //... }