使用@ionic-native/file/ngx - Android 11 从 Android 下载文件夹读取文本文件时出现问题
Issue when reading text file from Android Download folder with @ionic-native/file/ngx - Android 11
我有一个 Ionic 5 应用程序,我正在使用 @ionic-native/file/ngx 和 cordova-plugin-file 插件在 Android.
上将文本文件读入我的应用程序
我的代码如下图:
const path = this.file.externalRootDirectory + 'Download';
this.file.readAsText(path, 'foo.txt').then((file) => {
console.log('process file');
}).catch((e) => {
console.log('error '+ e);
});
这适用于几部手机 运行 Android 9. Pixel 3 运行 Android 10 不适用。它也不适用于 Pixel 运行 Android 11. 承诺 returns null.
我尝试过的事情:
使用 checkDir() 验证目录是否存在
使用 FileChooser 和 filePath.resolveNativePath
使用 androidPermissions READ_EXTERNAL_STORAGE 设置为 true
这是我的 Ionic 信息
离子:
Ionic CLI : 6.12.2 (/Users/.nvm/versions/node/v12.18.3/lib/node_modules/@ionic/cli)
Ionic Framework : @ionic/angular 5.4.3
@angular-devkit/build-angular : 0.1002.0
@angular-devkit/schematics : 10.1.7
@angular/cli : 10.2.0
@ionic/angular-toolkit : 2.3.3
Cordova:
Cordova CLI : 10.0.0
Cordova Platforms : android 9.0.0, ios 6.1.1
Cordova Plugins : cordova-plugin-ionic-keyboard 2.2.0, cordova-plugin-ionic-webview 5.0.0, (and 15 other plugins)
Utility:
cordova-res (update available: 0.15.2) : 0.15.1
native-run (update available: 1.2.2) : 1.0.0
System:
ios-sim : 8.0.2
NodeJS : v12.18.3 (/Users/.nvm/versions/node/v12.18.3/bin/node)
npm : 6.14.8
OS : macOS Catalina
Xcode : Xcode 12.2 Build version 12B45b
任何关于我可以做些什么来解决这个问题的想法都将不胜感激。
Android 在 Android 10(API 级别 29)中实施了一项新的存储策略,该策略在 Android 11(API 级别 30)中实施) 称为 Scoped Storage。默认情况下,它会阻止应用程序访问一般文件系统,在您的情况下是下载文件夹。
我建议重新构建系统的长期解决方案,以不需要下载文件夹中的信息,因为那里可能包含大多数应用程序不应访问的敏感信息。但是,如果您确实需要访问权限,则必须使用新权限:MANAGE_EXTERNAL_STORAGE.
对于 Android 10,已将标志添加到 cordova-plugin-file recently 以确保 OS 使用旧文件策略,因此您的代码 如果您使用的是最新的插件版本,应该可以工作。如果你需要直接从仓库安装它:
cordova plugin rm cordova-plugin-file --force
cordova plugin add https://github.com/apache/cordova-plugin-file
订阅 related issue 了解更多。
在我的例子中,我必须将 <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
添加到我的 AndroidManifest.xml,然后我进入“设置”>“隐私”>“权限管理器”>“文件和媒体”并在那里搜索我的应用程序,然后当您单击它时你会看到选项“允许管理所有文件”。
你必须手动完成,我还没有找到自动化流程的方法,但我希望你可以使用它作为解决方案。
我有一个 Ionic 5 应用程序,我正在使用 @ionic-native/file/ngx 和 cordova-plugin-file 插件在 Android.
上将文本文件读入我的应用程序我的代码如下图:
const path = this.file.externalRootDirectory + 'Download';
this.file.readAsText(path, 'foo.txt').then((file) => {
console.log('process file');
}).catch((e) => {
console.log('error '+ e);
});
这适用于几部手机 运行 Android 9. Pixel 3 运行 Android 10 不适用。它也不适用于 Pixel 运行 Android 11. 承诺 returns null.
我尝试过的事情:
使用 checkDir() 验证目录是否存在 使用 FileChooser 和 filePath.resolveNativePath 使用 androidPermissions READ_EXTERNAL_STORAGE 设置为 true
这是我的 Ionic 信息
离子:
Ionic CLI : 6.12.2 (/Users/.nvm/versions/node/v12.18.3/lib/node_modules/@ionic/cli)
Ionic Framework : @ionic/angular 5.4.3
@angular-devkit/build-angular : 0.1002.0
@angular-devkit/schematics : 10.1.7
@angular/cli : 10.2.0
@ionic/angular-toolkit : 2.3.3
Cordova:
Cordova CLI : 10.0.0
Cordova Platforms : android 9.0.0, ios 6.1.1
Cordova Plugins : cordova-plugin-ionic-keyboard 2.2.0, cordova-plugin-ionic-webview 5.0.0, (and 15 other plugins)
Utility:
cordova-res (update available: 0.15.2) : 0.15.1
native-run (update available: 1.2.2) : 1.0.0
System:
ios-sim : 8.0.2
NodeJS : v12.18.3 (/Users/.nvm/versions/node/v12.18.3/bin/node)
npm : 6.14.8
OS : macOS Catalina
Xcode : Xcode 12.2 Build version 12B45b
任何关于我可以做些什么来解决这个问题的想法都将不胜感激。
Android 在 Android 10(API 级别 29)中实施了一项新的存储策略,该策略在 Android 11(API 级别 30)中实施) 称为 Scoped Storage。默认情况下,它会阻止应用程序访问一般文件系统,在您的情况下是下载文件夹。
我建议重新构建系统的长期解决方案,以不需要下载文件夹中的信息,因为那里可能包含大多数应用程序不应访问的敏感信息。但是,如果您确实需要访问权限,则必须使用新权限:MANAGE_EXTERNAL_STORAGE.
对于 Android 10,已将标志添加到 cordova-plugin-file recently 以确保 OS 使用旧文件策略,因此您的代码 如果您使用的是最新的插件版本,应该可以工作。如果你需要直接从仓库安装它:
cordova plugin rm cordova-plugin-file --force
cordova plugin add https://github.com/apache/cordova-plugin-file
订阅 related issue 了解更多。
在我的例子中,我必须将 <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
添加到我的 AndroidManifest.xml,然后我进入“设置”>“隐私”>“权限管理器”>“文件和媒体”并在那里搜索我的应用程序,然后当您单击它时你会看到选项“允许管理所有文件”。
你必须手动完成,我还没有找到自动化流程的方法,但我希望你可以使用它作为解决方案。