2013-09-06 2 views
8

Для целей тестирования я скопировал полный пример, найденный на phonegap camera API, и я поставил предупреждение на onPhotoDataSuccess, чтобы проверить, когда функция запущена. На первой сделанной фотографии предупреждение не будет отображаться. Однако после первой попытки предупреждение будет показано после сохранения фотографии.Phonegap (3.0.0) Камера не удалась с первой попытки

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

Я тестировал код ниже на моем 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> 

---------- UPDATE 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 на самом деле не показывает мне ничего, с чем можно работать.

---------------- UPDATE 2 ----------------

Я просто попытался его на PhoneGap построить и оно работает. Поэтому он должен иметь какое-то отношение к плагину ...

+0

мог действительно использовать здесь ответ, если кто-нибудь знает. Это для 3.0.0 или 3.0.0rc1? –

+1

Не могли бы вы вставить код, который вы используете, и сообщить нам, с какого телефона вы тестируете. – Zorayr

+0

Вы разрабатываете для iOS? Из документа [PhoneGap docs] (http://docs.phonegap.com/en/3.0.0/cordova_camera_camera.md.html#camera.getPicture): «Включение предупреждения JavaScript() в любой из функций обратного вызова может вызвать проблемы Оберните оповещение в setTimeout(), чтобы разрешить сборщик изображений или всплывающее окно iOS полностью закрыть до появления предупреждения: «Если вы измените оповещение на console.log, работает ли первый обратный вызов? – ville

ответ

1

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

Попробуйте использовать navigator.camera.PictureSourceType instated of 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 }); 

Update: Попытка сохранить corodova.js локально и вызов из местного каталога, поэтому ваш каталог должен понравиться

assets/www/js/cordova.js

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

Working Code

Надеется, что это поможет !!!

+0

navigator.camera.getPicture (cameraSuccess, cameraError, [cameraOptions]); Кажется, что CameraSuccess происходит на втором снимке, однако изображение, которое я получаю, является первым, которое я взял. –

+0

'На первом снятом снимке предупреждение не будет отображаться. Однако после первой попытки предупреждение будет показано после сохранения фотографии. '? действительно ли это происходит с вами? Я тестировал ваш код и вызывал 'alert()' внутри 'onPhotoDataSuccess' и отлично работал. –

1

У меня была такая же проблема после обновления с 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
  • Проверить разрешения
  • Построить

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

0

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

Просто заменить мой старый приложение/bin/cordova.jar файл с новым 3.2.0 Cordova-dev.jar (в eclispe) и все еще в порядке :)

0

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

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

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

0

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

0

У меня была эта проблема с 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); 
      } 
    } 

    //... 
} 
Смежные вопросы