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回调函数永远不会被触发。当调用上述函数时,在Chrome开发工具控制台中没有它的痕迹它打开文件选择窗口,在选择上传图像后它只返回,然后刷新屏幕。
更新6/26 经过更多测试后注意到,这两种不同的Android设备之间的行为不同,一个是Jelly bean版本4.4.2和其他Jelly bean版本4.4.4。在使用4.4.4运行的设备中,navigator.camera.getPicture已成功调用,但在文件传输时被触发。运行Jelly bean 4.4.2的设备刚刚在navigator.camera.getPicture中失败而没有调用它的成功或错误回调函数,这是我几天以来所遇到的。看起来像带有相机插件2.2.0的cordova 5.1不适用于Jelly Bean或它的一些版本。也许我需要找到cordova版本&适用于Jelly Bean的cordova相机插件版本。
更新6/25 将代码从Telerik AppBuilder迁移到PhoneGap。 PhoneGap使用Cordova 5.1并配置了最新的Camera Plugin 2.2.0,但问题仍然相同。不确定这个问题是否与此问题相同post非常有趣这个问题未在release notes中列出,我在不同的Android版本中测试过它不起作用。到目前为止,Telerik Premium支持的机票至少没有响应。
更新6/23 1:28IST 正如Devid所建议的那样,在this post之后我在调用navigator.camera.getPicture之前添加了下面推荐的修复,问题仍然存在。
if (device.platform === 'Android') {
setInterval(function () {
cordova.exec(null, null, '', '', [])
}, 200);
}
更新:6/23 我从chrome检查了控制台中的行为://检查文件上传活动期间绝对没有跟踪。在网络选项卡中找不到此http请求。要了解它停止运行的位置,我在uploadFile函数中的每个阶段添加了console.log,我注意到它没有在navigator.camera.getPicture中触发uploadPhoto回调函数,但是这个调用确实调用了文件选择器,但是在文件选择后它的回调uploadPhoto函数没有触发。看起来应用程序在设备上没有一些访问权限。
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
});
Here是来自亚行的catlog,如果有的话会给出一些线索。
更新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只是不对我的应用程序的文件上传活动做任何事情。同样的活动从模拟器中完美运作。
答案 0 :(得分:1)
好的,因为自12天以来没有人回答我的问题,所以决定回答我自己的问题。经过网上对此问题的各种调查结果。我发现有一个社区正在测试认证整个设备上的cordova构建。在他们的网站上清楚地记录了使用Android设备的cordova-camera-plugin存在的问题。以下是website
中提到的内容 cordova-plugin-camera (version 1.0.1). The camera fails many of our tests on Samsung devices running Jellybean, Kitkat, and Lollipop. We noticed various other issues across iOS and Windows Phone 8 as well. Because of these issues, we will not be including the camera as a part of this kit.
有一些建议的解决方法我也在我的问题中提到过,但遗憾的是那些我现在正在测试的Jelly Bean平台上没有工作。
因此,合乎逻辑的结论是发展和在Android工作室中使用Android SDK构建本机应用程序,而不是浪费时间和时间。寻找修复cordova-camera-plugin的能量。我知道这可能不太理想,但我认为这是在这个时间点处理的方法。希望这个答案可以为遇到类似问题的人节省时间
看起来corodva相机插件适用于最新的Android 6.x版本。 https://issues.apache.org/jira/browse/CB-10857但是这对我的用户仍然使用旧版Android的情况不起作用。这是文件传输即使在原生SDK代码中也不会工作的唯一选择,但这种情况不太可能发生。