2013-09-06 8 views
8

Per scopi di test, ho copiato l'intero esempio trovato su phonegap camera API e ho messo un avviso su onPhotoDataSuccess per verificare quando la funzione è stata attivata. Nella prima foto scattata l'avviso non verrà visualizzato. Tuttavia, dopo il primo tentativo, l'avviso verrà visualizzato dopo il salvataggio della foto.PhoneGap (3.0.0) Fotocamera non riuscita al primo tentativo

Qualche consiglio? Sarò felice di essere più specifico se qualcosa non è chiaro.

Ho testato il codice qui sotto sul mio Galaxy S3 Android

<!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 ----------------- -

ho testato su un altro pezzo di codice:

(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); 

}()); 

E questo ha lo stesso effetto. Non fa nulla durante il primo scatto ma mostra l'immagine dopo il secondo scatto. Ho anche appena scoperto che l'immagine che mostra dopo il secondo è lo snap è la prima foto che ho scattato. Sembra che il primo argomento in getPicture non si attivi sul primo snap. Questo è frustrante in quanto logcat in realtà non mi mostra nulla su cui lavorare.

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

ho appena provato su PhoneGap Costruire e Funziona. Quindi deve avere qualcosa a che fare con il plugin ...

+0

potrebbe davvero usare una risposta qui se qualcuno sa. È questo per 3.0.0 o 3.0.0rc1? –

+1

Potresti incollare il codice che stai usando e dirci con quale telefono stai provando. – Zorayr

+0

Stai sviluppando per iOS? Da [PhoneGap docs] (http://docs.phonegap.com/en/3.0.0/cordova_camera_camera.md.html#camera.getPicture): "L'inclusione di un avviso JavaScript() in una delle funzioni di callback può causare problemi . Avvolgere l'avviso all'interno di un setTimeout() per consentire al selettore di immagini iOS o al popover di chiudere completamente prima che venga visualizzato l'avviso: "Se si modifica l'avviso su console.log, la prima callback funziona? – ville

risposta

1

Non so se questa sia la soluzione giusta o meno, ma funziona perfettamente per me. Sarebbe battitore per rintracciare il tuo gatto di registro e trovato il problema esatto.

Provare a utilizzare navigator.camera.PictureSourceType di pictureSource. così sembra che

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

e allo stesso modo sostituire nel codice Javascript e

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

O

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

Aggiornamento: tenta di salvare le corodova.js a livello locale e la chiamata dalla directory locale, quindi la directory dovrebbe come

assets/www/js/cordova.js

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

Working Code

Spero che questo vi aiuterà !!!

+0

navigator.camera.getPicture (cameraSuccess, cameraError, [cameraOptions]); Sembra che la fotocamera SUCCESSA avvenga sulla seconda foto scattata, tuttavia l'immagine che ottengo è la prima che ho scattato. –

+0

'Sulla prima foto scattata l'avviso non verrà visualizzato. Tuttavia, dopo il primo tentativo, l'avviso verrà visualizzato dopo aver salvato la foto.? è davvero successo con te? Ho testato il tuo codice e chiamando 'alert()' dentro 'onPhotoDataSuccess' e funziona perfettamente. –

1

Ho avuto lo stesso problema dopo l'aggiornamento dalla 3.0.0 alla 3.1.0. Fotocamera differita, nessuna geolocalizzazione, ecc.

Verificare se il file platforms\android\cordova\version indica una versione precedente. Quindi devi aggiornare la tua piattaforma. Quindi ecco cosa ho fatto.

  • Rimuovere tutti i plugin: cordova plugin rm org.apache.cordova.camera
  • Rimuovere la piattaforma: cordova platform remove android (cancellerà le modifiche apportate al file * .java)
  • Aggiungere la piattaforma: cordova platform add android
  • Aggiungere tutti i plugin: cordova plugin add org.apache.cordova.camera
  • Verifica autorizzazioni
  • Build it

Fondamentalmente è come creare un nuovo progetto.

0

aveva esattamente lo stesso problema. Il successo dell'acquisizione stava ricevendo solo il callback dopo che captureVideo era stato chiamato per la seconda volta.

appena sostituito il mio vecchio/file di cordova.jar app/bin con il nuovo 3.2.0 Cordova-dev.jar (in eclispe) e tutto torna in ordine :)

0

Ho avuto questo problema esatta su Cordova 3.4. 0, con una nuova installazione di Cordova (nessun aggiornamento dalla versione precedente come altri hanno pubblicato). Scattare la prima foto non farebbe nulla: nessuna richiamata di successo, nessuna richiamata di fail. L'acquisizione della seconda immagine comporterebbe una richiamata riuscita, ma i dati DATA_URL (l'immagine codificata Base64) restituita erano i dati della prima immagine.

Per me funzionava bene su un telefono, vari emulatori, ecc. Eccetto su un telefono Android 4.2 in cui lo ha fatto. La soluzione consisteva nel disinstallare l'app dal telefono utilizzando la gestione delle applicazioni del telefono sotto le impostazioni, quindi reinstallare l'app, quindi la prima immagine avrebbe attivato la richiamata di successo con i propri dati.

Non ho idea del perché, ma la disinstallazione e la reinstallazione dell'applicazione lo hanno risolto per me.

0

Ho incontrato lo stesso problema e l'ho risolto. Perché importi due "cordova.js" nella tua app, e forse uno è nell'iframe. puoi invece usare "parent.cordova" in iframe.

0

Ho avuto questo problema con Cordova 3.7.1 e Camera 0.3.5 - ogni volta che ho chiamato il plugin, non ha restituito l'immagine/percorso e in seconda chiamata ha restituito l'errore "Annullato" per la chiamata precedente.

Il problema era che la mia attività principale aveva proprio onActivityResult che non chiamava correttamente il metodo del super.

public class MainActivity extends CordovaActivity { 
    //... 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
      if (requestCode == MyCustomActivity) { 
        doMyCustomActivity(requestCode); 
      } 
    } 

    //... 
} 

Per risolvere il problema, ho dovuto aggiungere altro a chiamare il corretto gestore:

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); 
      } 
    } 

    //... 
} 
Problemi correlati