Android 6上没有返回fileEntry结果

时间:2017-11-06 18:45:14

标签: android cordova cordova-plugin-file

我的Cordova应用程序中出现了文件读取权限问题,但我无法正常追踪它。在Android 5和Android 6之间,我看到与fileEntry的同一次调用完全不同的结果。 是否有人知道是否需要更改以便能够在Android中读取文件/目录> 5

Gory详细信息:我将代码复制到只有cordova-plugin-file的helloWorld应用程序(调用cordova create hello),并得到相同的结果。我的更改如下:

我在index.html的主体中添加了一个元素:

        <div id="contents"></div>

我还更改了index.js中的stock receivedEvent方法,只是遍历设备上的各个目录并返回cordova-plugin-file给我的内容:

receivedEvent: function (id) {
    "use strict";

    var parentElement = document.getElementById(id),
        listeningElement = parentElement.querySelector('.listening'),
        receivedElement = parentElement.querySelector('.received'),
        localURLs    = [
            cordova.file.documentsDirectory,
            cordova.file.externalRootDirectory,
            cordova.file.sharedDirectory,
            cordova.file.syncedDataDirectory
        ],
        DirsRemaining = localURLs.length,
        i,
        contents = "",
        addFileEntry = function (entry) {
            var dirReader = entry.createReader();
            dirReader.readEntries(
                function (entries) {
                    var i;
                    for (i = 0; i < entries.length; i += 1) {
                        if (entries[i].isDirectory === true) {
                            contents += "<h2> Directory: " + entries[i].fullPath + "</h2>";
                            // Recursive -- call back into this subdirectory
                            DirsRemaining += 1;
                            addFileEntry(entries[i]);
                        } else {
                            contents += "<p> File: " + entries[i].fullPath + "</p>";
                        }
                    }
                    DirsRemaining -= 1;
                    if (DirsRemaining <= 0) {
                        if (contents.length > 0) {
                            document.getElementById("contents").innerHTML = contents;
                        } else {
                            // nothing to select -- inform the user
                            document.getElementById("contents").innerHTML = "No documents found";
                        }
                    }
                },
                function (error) {
                    console.log("readEntries error: " + error.code);
                    contents += "<p>readEntries error: " + error.code + "</p>";
                }
            );
        },
        addError = function (error) {
            // log the error and continue processing
            console.log("getDirectory error: " + error.code);
            DirsRemaining -= 1;
        };
    for (i = 0; i < localURLs.length; i += 1) {
        if (localURLs[i] === null || localURLs[i].length === 0) {
            DirsRemaining -= 1;
            continue; // skip blank / non-existent paths for this platform
        }
        window.resolveLocalFileSystemURL(localURLs[i], addFileEntry, addError);
    }

    listeningElement.setAttribute('style', 'display:none;');
    receivedElement.setAttribute('style', 'display:block;');

    console.log('Received Event: ' + id);
}

可能的安全配置:

我的platforms/android/AndroidManifest.xml文件包含相应的权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

这是我在index.html中的CSP(它只是股票中的一个):

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; img-src 'self' data: content:;">

以下是结果:

Android 5

Android 5.注意目录和文件(屏幕外还有其他文件)

Android 6

Android 6.请注意,我应该显示cordova.file.externalRootDirectory下的子目录中的一些文件;它也应该显示子目录本身。

1 个答案:

答案 0 :(得分:0)

给@greenapps提示提示 - 这种行为显然是由于Android 6中引入的运行时权限。

对于Cordova,有一个插件可以解决问题,直到cordova-android被清理一下(截至11/6/2017,PhoneGap Build使用cordova-android 6.2.3,这取决于{{1处理这个)。我现在的解决办法:

cordova-plugin-compat

然后例程添加适当的运行时权限:

cordova plugin add cordova.plugins.diagnostic