android - 如何确保我的 Android 6 Cordova 应用在尝试访问文件系统之前提示用户授予权限?

标签 android cordova permissions html5-filesystem

我正在将 Cordova 3.4 应用程序升级到 Cordova 6.0,同时将部署平台(Nexus 平板电脑)从 Android 4.4 升级到 Android 6。作为此过程的一部分,我升级了文件系统插件 cordova-plugin -文件 从 v0.2.5 到 v4.1.1

该应用程序在首次运行时在共享文件系统 (file:///storage/emulated/0/) 上创建一个包含 10 个文件夹的目录结构。我已将以下首选项添加到 config.xml 以确保在新版本的应用程序中使用相同的位置:

<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="23" />
<preference name="AndroidPersistentFileLocation" value="Compatibility" />

我知道 Android 6 中有一个新的权限模型,用户必须分别允许应用程序请求的每个权限。

If the device is running Android 6.0 (API level 23) or higher, and the app's targetSdkVersion is 23 or higher, the app requests permissions from the user at run-time. Android Developer documentation

当安装在已安装较早版本(以及卸载后)且已创建目录结构的平板电脑上时,我的应用程序的新版本在首次运行时按预期执行,提示用户允许访问权限文件系统。

但是,当安装在以前从未安装过该应用程序的平板电脑上时(或者当我删除由早期版本创建的目录结构时),该应用程序因抛出 FileError.PATH_EXISTS_ERR 错误而失败。它不会按预期提示用户允许访问文件系统的权限。

我检查过在构建应用程序时,生成的 AndroidManifest.xml 确实包含必要的权限属性:

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

我当前的解决方法是停止该应用程序,导航至“设置”>“应用程序”>“我的应用程序”>“权限”并在再次运行该应用程序之前手动启用“存储”权限。但我真的不希望我的用户必须这样做!

我如何确保应用在实际尝试访问文件系统之前提示用户提供所需的权限?

这是我的一些代码示例:

window.requestFileSystem(window.LocalFileSystem.PERSISTENT, 4000 * 1024 * 1024, gotFileSystem, errorHandler);

function gotFileSystem(fileSystem) {

    // store reference to file system
    fs = fileSystem;
}

function createDir(directoryName) {

    var directoryCreated = when.defer();

    fs.root.getDirectory(directoryName, {
            create: true
        }, function (dirEntry) {            
            directoryCreated.resolve();
        }, function(e) {
            directoryCreated.reject(e);
        }
    );

    return directoryCreated.promise;
}

最佳答案

升级到 Android 6 (MArshmallow) 后遇到完全相同的问题。 Cordova 文件插件 (v 4.1.1) 在 Android Marshmallow 中存在权限问题。此问题将不允许在 android 文件系统中创建文件夹,导致路径存在错误。

这个问题现在已经解决了。您可能需要从 cordova 文件插件 github 中的 android src 文件夹中提取最新的 FileUtils.java 才能完成这项工作。更新插件后,首次访问文件系统时,应用程序会向用户请求访问权限。随后的请求从那时起就可以正常工作。检查 Apache 问题跟踪器中的 CB-10798 以获取相关信息。希望对你有帮助

关于android - 如何确保我的 Android 6 Cordova 应用在尝试访问文件系统之前提示用户授予权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36403959/

相关文章:

ios - 当手机处于静音模式时在我的后台应用程序上播放声音

android - 如何替换为 localhost 链接?安卓

cordova - 安装 Cordova 插件购买并将其与 Google Play Developer Console 一起使用

permissions - rsync 守护进程和权限

android - Phonegap 将项目添加到通知托盘

cordova - 将插件安装到 Visual Studio Cordova 项目

design-patterns - 在哪里应用域级权限

android - 是否可以在 2 个不同的 Android 应用程序中为内容提供商拥有相同的权限?

android - 多个 View 的 state_pressed 背景,onClick

android - 来自一个 Activity 的asyncTask在另一个 Activity android中运行