如何确保我的 Android 6 Cordova 应用程序在尝试访问文件系统之前提示用户授予权限?
How can I ensure that my Android 6 Cordova app prompts the user to give permission before attempting to access the filesystem?
我正在将 Cordova 3.4 应用程序升级到 Cordova 6.0,同时将部署平台(Nexus 平板电脑)从 Android 4.4 升级到 Android 6。作为其中的一部分,我已经将文件系统插件 cordova-plugin-file
从 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" />
我知道 Android6 中有一个新的权限模型,用户必须分别允许应用程序请求的每个权限。
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" />
我目前的解决方法是停止该应用程序,导航至“设置”>“应用程序”>“我的应用程序”>“权限”并在再次 运行 应用程序之前手动启用 "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 以获取相关信息。希望对你有帮助
我正在将 Cordova 3.4 应用程序升级到 Cordova 6.0,同时将部署平台(Nexus 平板电脑)从 Android 4.4 升级到 Android 6。作为其中的一部分,我已经将文件系统插件 cordova-plugin-file
从 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" />
我知道 Android6 中有一个新的权限模型,用户必须分别允许应用程序请求的每个权限。
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" />
我目前的解决方法是停止该应用程序,导航至“设置”>“应用程序”>“我的应用程序”>“权限”并在再次 运行 应用程序之前手动启用 "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 以获取相关信息。希望对你有帮助