2013-09-06 7 views
8

phonegap camera APIにある完全な例をコピーして、onPhotoDataSuccessに警告を出して、その機能がいつ呼び出されたかをテストします。撮影された最初の写真では、警告は表示されません。ただし、最初の試行後に、写真が保存された後に警告が表示されます。Phonegap(3.0.0)最初の試行でカメラが正常に動作しない

アドバイスはありますか?何か不明な点があれば、私はもっと具体的になります。

私は私のアンドロイドギャラクシー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); 

}()); 

そして、これは同じ効果があります。最初のスナップ時には何もしませんが、2回目のスナップ後の画像が表示されます。私はまた、2番目の後に表示される画像がスナップしていることが、最初に撮った写真であることを知りました。 getPictureの最初の引数が最初のスナップでトリガされないようです。これは、logcatが本当に私に何かを表示するわけではないので、イライラしています。

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

私はPhoneGapの上でそれを試してみまし構築し、できます。だから、プラグインと何か関係があるはずです...

+0

は本当にここの回答を使用することができます。

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

それを修正するために、私は正しいハンドラを呼び出すためにELSE追加する必要がありました。これは3.0.0か3.0.0rc1ですか? –

+1

あなたが使用しているコードを貼り付けて、あなたがテストしている電話を教えてください。 – Zorayr

+0

iOS用に開発していますか? [PhoneGap docs](http://docs.phonegap.com/ja/3.0.0/cordova_camera_camera.md.html#camera.getPicture)から: "いずれかのコールバック関数にJavaScriptアラート()を含めると、問題が発生する可能性があります警告が表示される前にiOSの画像ピッカーまたはポップオーバーを完全に閉じるには、setTimeout()内に警告をラップします。「警告をconsole.logに変更すると、最初のコールバックは機能しますか? – ville

答えて

1

私はこれが正しい解決策であるかどうかはわかりませんが、私にとってはうまくいくかどうかはわかりません。それはあなたのログの猫をトレースするために打者であり、正確な問題を発見した。

navigator.camera.PictureSourceType添付資料pictureSourceを使用してください。それは

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

のように見え、同じよう

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

OR

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

だけでなくJavaScriptコードで

を置き換え更新: はあなたのローカル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は撮影された2枚目の画像に表示されるようですが、取得した画像は最初に撮影したものです。 –

+0

'撮影した最初の写真には警告が表示されません。しかし、最初の試みの後、写真が保存された後に警告が表示されます。それは本当にあなたと起こるのですか?私はあなたのコードをテストし、 'onPhotoDataSuccess'の中で' alert() 'を呼び出すと、それは完全に動作しています。 –

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が2度目に呼び出された後にのみコールバックを受信することでした。

はちょうど私がコルドバ3.4にこの正確な問題を抱えていたすべてのバックオーダー:)

0

の新しい3.2.0(eclispe中)コルドバ-dev.jarとして私の古いアプリ/ binに/ cordova.jarファイルを置き換えます。 0、新鮮なCordovaインストール(以前のバージョンからのアップグレードはありません)。最初の画像を撮ることは何もしません。成功したコールバック、失敗しないコールバックはありません。 2番目の画像を撮影すると成功したコールバックが返されますが、返されたDATA_URLデータ(base64でエンコードされた画像)はFIRST画像のデータでした。

私の場合は、1台の携帯電話、さまざまなエミュレータなどでうまくいきました。ソリューションは、設定の下で電話のアプリケーション管理を使用して電話からアプリをアンインストールしてから、アプリを再インストールすることでした。最初の画像は成功したコールバックをそれ自身のデータでトリガーします。

理由は分かりませんが、アプリをアンインストールして再インストールすると解決しました。

0

私は同じ問題を抱えて解決しました。あなたのアプリケーションで2つの "cordova.js"をインポートし、おそらく1つがiframeにあるからです。代わりにiframeに "parent.cordova"を使用することができます。

0

Cordova 3.7.1とCamera 0.3.5でこの問題が発生しました。プラグインを呼び出すたびに、画像/パスが返されず、2回目の呼び出しで以前の呼び出しで「キャンセル」エラーが返されました。

問題は、私の主な活動がsuperのメソッドを正しく呼び出さなかったonActivityResultを所有していたことでした。誰もが知っている場合

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

    //... 
} 
関連する問題