3

navigator.camera.getPicure 関数が機能していません。そのコールバック関数は、以下のコードで起動されることはありません。この関数は、cordova カメラ プラグインからのものです。

navigator.camera.getPicture(
                            uploadPhoto,
                            function(message) {
                                alert('Failed to get a picture. Please select one.');
                            }, {
                                quality         : 50,
                                destinationType : Camera.DestinationType.FILE_URI,
                                sourceType      : Camera.PictureSourceType.SAVEDPHOTOALBUM
                            });

上記のコードでは、uploadPhoto コールバック関数は起動されません。上記の関数が呼び出されたときにクロム開発ツールコンソールにその痕跡はありません。ファイル選択ウィンドウが開き、アップロード用に画像が選択された後、単に戻り、画面が更新されます。

更新 6/26 さらにテストを行った結果、この動作は、ジェリー ビーン バージョン 4.4.2 とジェリー ビーン バージョン 4.4.4 の 2 つの異なる Android デバイス間で異なることがわかりました。4.4.4 で実行されているデバイスでは、navigator.camera.getPicture が正常に呼び出されましたが、ファイル転送でヒットしました。Jelly bean 4.4.2 を実行しているデバイスは、成功またはエラーのコールバック関数を呼び出さずに navigator.camera.getPicture で失敗しました。これは、私が数日前に見つけた場所です。カメラ プラグイン 2.2.0 を使用した cordova 5.1 は、Jelly Bean またはそのいくつかのバージョンでは動作しないようです。たぶん、Jelly Bean で動作する cordova バージョンと cordova カメラ プラグイン バージョンを見つける必要があるでしょう。

6/25 更新 コードを Telerik AppBuilder から PhoneGap に移行しました。PhoneGap は Cordova 5.1 を使用し、最新の Camera Plugin 2.2.0 を構成していますが、問題は同じです。この問題がこの投稿と同じかどうかはわかりませんが、この問題はリリースノートに記載されていないため、動作しませんでした。そして、これまで Telerik プレミアム サポートで提起されたチケットへの応答はありません。

更新 6/23 1:28IST Devid が提案したように、navigator.camera.getPicture を呼び出す直前に推奨される修正を以下に追加したこの投稿に従いましたが、問題は同じままです。

if (device.platform === 'Android') {
  setInterval(function () {
     cordova.exec(null, null, '', '', [])
  }, 200);
}

更新: 6/23 chrome://inspect からコンソールで動作を確認しましたが、ファイルのアップロード アクティビティ中にまったくトレースがありません。ネットワーク タブで、この http 要求が見つかりませんでした。どこで機能が停止したかを理解するために、uploadFile 関数内に console.log の各ステージを追加しましたトリガーしませんでした。アプリがデバイス上で一部のアクセス権を持っていないようです。

navigator.camera.getPicture(
    uploadPhoto,
    function(message) {
        rst.innerHTML = "Failed to get a picture. Please select one.";
    }, {
        quality         : 50,
        destinationType : navigator.camera.DestinationType.FILE_URI,
        sourceType      : navigator.camera.PictureSourceType.PHOTOLIBRARY
    });

手がかりがあれば、ADBのカタログを次に示します

更新 2/24-9:15AMIST 以下は Android マニフェストです。不足している権限はありますか?

<?xml version="1.0" encoding="utf-8"?>
<manifest android:versionCode="$AndroidVersionCode$"
          android:versionName="$BundleVersion$"
          package="$AppIdentifier$"
          android:windowSoftInputMode="adjustPan"
          android:hardwareAccelerated="$AndroidHardwareAcceleration$"
          xmlns:android="http://schemas.android.com/apk/res/android" >
    <supports-screens
        android:largeScreens="true"
        android:normalScreens="true"
        android:smallScreens="true"
        android:xlargeScreens="true"
        android:resizeable="true"
        android:anyDensity="true"
        />

    <application android:label="@string/app_name"
                 android:icon="@drawable/icon"
                 android:hardwareAccelerated="$AndroidHardwareAcceleration$"
                 android:debuggable="true" >
        <activity android:label="@string/app_name"
                  android:name=".TelerikCallbackActivity"
                  android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
                  android:launchMode="singleTop"
                  android:theme="@android:style/Theme.Black.NoTitleBar" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="21"/>
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

以下の cordova ファイル アップロード コードは、シミュレーターでは完全に機能しますが、Android デバイスに展開すると失敗します。

以下はconfig.xmlです

<widget xmlns     = "http://www.w3.org/ns/widgets"
        version   = "2.0.0">

    <content src="index.html" />

    <!-- Whitelist docs: https://github.com/apache/cordova-plugin-whitelist -->

    <!-- allow local pages -->
    <!-- <access origin="http://127.0.0.1*"/> -->
    <access origin="*" />

    <!-- Grant certain URLs the ability to launch external applications. This
         behaviour is set to match that of Cordova versions before 3.6.0, and
         should be reviewed before launching an application in production. It
         may be changed in the future. -->
    <allow-intent href="http://*/*" />
    <allow-intent href="https://*/*" />
    <allow-intent href="tel:*" />
    <allow-intent href="sms:*" />
    <allow-intent href="mailto:*" />
    <allow-intent href="geo:*" />
    <allow-intent href="market:*" />

    <preference name="loglevel" value="DEBUG" />
    <!--
      <preference name="splashscreen" value="splash" />
      <preference name="backgroundColor" value="0xFFF" />
      <preference name="loadUrlTimeoutValue" value="20000" />
      <preference name="InAppBrowserStorageEnabled" value="true" />
      <preference name="disallowOverscroll" value="true" />
    -->
</widget>

以下はクライアントコードです

uploadFile: function () {
    rst = document.getElementById(this.id + 'res');
    rst.innerHTML = "";
    var uploadTYPE = this.id;
    navigator.camera.getPicture(
        uploadPhoto,
        function(message) {
            rst.innerHTML = "Failed to get a picture. Please select one.";
        }, {
            quality         : 50,
            destinationType : navigator.camera.DestinationType.FILE_URI,
            sourceType      : navigator.camera.PictureSourceType.PHOTOLIBRARY
        });

    function uploadPhoto(fileURI) {
        var options = new FileUploadOptions();
        options.fileKey = "file";
        options.fileName = fileURI.substr(fileURI.lastIndexOf('/') + 1);

        if (cordova.platformId == "android") {
            options.fileName += ".jpg" 
        }

        options.mimeType = "image/jpeg";
        //options.httpMethod = "PUT";
        //options.contentType = 'multipart/form-data';
        var params = new Object();
        params.uid = localStorage.getItem("FOSCode");
        params.utyp = uploadTYPE;
        options.params = params; 

        options.headers = {
            Connection: "close"
        };
        //options.httpMethod = 'POST';
        options.chunkedMode = false;

        var ft = new FileTransfer();

        rst.innerHTML = "Upload in progress...";
        ft.upload(
            fileURI,
            encodeURI("https://www.kinrep.com/foster/upload.php"),
            onFileUploadSuccess,
            onFileTransferFail,
            options, true);

        function onFileUploadSuccess (result) {
           // rst.innerHTML = "Upload successful";
            console.log("FileTransfer.upload");
            console.log("Code = " + result.responseCode);
            console.log("Response = " + result.response);
            console.log("Sent = " + result.bytesSent);
            console.log("Link to uploaded file: https://www.kinrep.com/foster/ws/contentlibrary/" + result.response);
            var response = result.response;
            var destination = "https://www.kinrep.com/foster/WS/ContentLibrary/" + response.substr(response.lastIndexOf('=') + 1);
            if(this.id == 'uploadcheque') {
                document.getElementById("hdnchequeimgpath").value = destination;

            } else if(this.id == 'uploaddoorlock') {

                document.getElementById("hdndoorlockedimgpath").value = destination;
            } else {

                document.getElementById("hdnothersimgpath").value = destination;
            }
            rst.innerHTML = "File uploaded to: " +
                                                          destination + 
                                                          "</br><button class=\"button\" onclick=\"window.open('" + destination + "', '_blank', 'location=yes')\">Open Location</button>";
            //document.getElementById("downloadedImage").style.display="none";
        }

        function onFileTransferFail (error) {

            rst.innerHTML = "File Transfer failed: " + error.code;
            alert(rst.innerHTML);
            console.log("FileTransfer Error:");
            console.log("Code: " + error.code);
            console.log("Source: " + error.source);
            console.log("Target: " + error.target);
        }
    }

logcat から、エラーを再現した後、アプリから何も追跡できませんでした。Android は、アプリからのファイル アップロード アクティビティに対して何もしません。同じアクティビティがシミュレーターから完璧に機能します。

4

1 に答える 1

2

さて、12日間投稿された私の質問に誰も答えなかったので、私自身の質問に答えることにしました. ネット全体でこの問題に関するさまざまな発見があった後。複数のデバイスで Cordova ビルドをテスト認定しているコミュニティが 1 つあることがわかりました。彼らの Web サイトでは、Android デバイスの cordova-camera-plugin に問題があることが明確に文書化されています。以下は、彼らのウェブサイトで言及されているものです

cordova-plugin-camera (バージョン 1.0.1)。カメラは、Jellybean、Kitkat、および Lollipop を実行している Samsung デバイスでの多くのテストに失敗しました。iOS と Windows Phone 8 にもさまざまな問題があることに気付きました。これらの問題のため、このキットの一部としてカメラを含めません。

質問でも言及した回避策がいくつか提案されていますが、残念ながら、それらは現在テストしている Jelly Bean プラットフォームでは機能しませんでした。

したがって、論理的な結論は、cordova-camera-plugin の修正を見つけるために時間とエネルギーを浪費する代わりに、Android Studio で Android SDK を使用してネイティブ アプリを開発および構築することです。これは理想的ではないかもしれませんが、これが現時点での対処方法だと思います。この回答が、同様の問題を経験した人の時間を節約できることを願っています

corodva カメラ プラグインは、最新の android 6.x バージョンで動作するようです。https://issues.apache.org/jira/browse/CB-10857しかし、ユーザーがまだ古い Android バージョンを使用している場合、これは機能しません。これは、ネイティブ SDK コードでもファイル転送が機能しない場合の唯一の選択肢ですが、そのようなケースはほとんどありません。

于 2016-06-26T17:05:11.703 に答える