Android kitkat:fileChooser + fileTransfer cordova插件无法正常工作

时间:2014-12-07 20:57:04

标签: java android cordova android-intent

我正在使用apache cordova框架构建一个Android应用程序。

在android 4.4中,按照下面的问题

进行了工作

https://issues.apache.org/jira/browse/CB-5294

为此我在filechooser插件下面使用

https://github.com/don/cordova-filechooser

直到现在我可以打开文件选择器对话框并选择文件。

当我尝试使用以下代码上传文件时

                var def = Q.defer();
                var options = new FileUploadOptions();
                options.fileKey = "file";
                options.fileName = file.substr(file.lastIndexOf('/') + 1);
                var params = {};
                params.title = title;
                options.params = params;
                options.trustAllHosts = true;
                var ft = new FileTransfer();
                var url = Constants.API_SERVICE_URL + "upload";
                ft.upload(file, encodeURI(url), function(res) {
                    // check for HTTP OK status and success
                    if(res.responseCode === 200 && res.response && res.response.status !== "fail") {
                        def.resolve(res.response);
                    } else {
                        def.reject(res);
                    }
                    def.resolve(res);
                }, function(err) {
                    def.reject(err);
                }, options);
                return def.promise;

此处的文件类似于

content://com.android.providers.media.documents/document/image:28029

我得到了java.lang.SecurityException

我对这个主题做了很多研究,但我无法找到答案。

此处描述了此问题 https://issues.apache.org/jira/browse/CB-5398

此问题已标记为已解决,但此评论中描述的解决方法无效

https://issues.apache.org/jira/browse/CB-5398?focusedCommentId=13977552&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13977552

如果我这样做,我收到文件未找到异常,文件网址就像

file://storage/emulated/0/images/image.png

以下stackoverflow问题是相关的

Kitkat, error while trying to load an image

这个问题有一个答案,我也试过了,但那也行不通。

我在我的android清单文件中添加了MANAGE_DOCUMENTS权限 所有权限列表

<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>  
<uses-permission android:name="android.permission.WAKE_LOCK"/>  
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>  
<uses-permission android:name="android.permission.USE_CREDENTIALS"/>  
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

但是如果我从图库选项或旧文件管理器中选择文件。它工作正常。

我知道如何解决这个问题?

修改

Apache cordova版本3.6

2 个答案:

答案 0 :(得分:1)

尝试使用Cesidio DiBenedetto插件而不是您使用的插件 https://github.com/cdibened/filechooser

这里有一个使用它的示例项目

https://github.com/jcesarmobile/FileBrowserAndroidTest

答案 1 :(得分:0)

你在合适的时间问了这个问题!我挣扎了几天,我已经解决了。

以下代码适用于4.4以下的Android版本,但不适用于kitkat。

options.fileName = file.substr(file.lastIndexOf('/') + 1);

我创建了一个Android项目,我发现在Android 4.4中,&#39;文件&#39;(文件名)似乎是&#39; 7961&#39;(或其他数字)实际名称&#39; abc.png&#39;。 我们需要的是下面的代码。

window.resolveLocalFileSystemURI(imageUri, function (fileEntry) {
                        fileEntry.file(function (fileObj) {
                            var fileName = fileEntry.name;
                            var options = new FileUploadOptions();
                            options.headers = {Connection: "close"};
                            options.fileKey = "uploadfiles";
                            //change the code below.
                            // if(fileName.indexOf('/')>-1){
                            // options.fileName = fileName.substr(fileName.lastIndexOf('/') + 1);
                            options.fileName = fileEntry.nativeURL.substr(fileEntry.nativeURL.lastIndexOf('/') + 1);

如果这对您有用,请告诉我。