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 は、アプリからのファイル アップロード アクティビティに対して何もしません。同じアクティビティがシミュレーターから完璧に機能します。