cordova 使用@ionic-native/file/ngx从Android下载文件夹阅读文本文件时出现问题- Android 11

thtygnil  于 2022-11-15  发布在  Ionic
关注(0)|答案(2)|浏览(174)

我有一个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的手机。运行Android 10的Pixel 3不起作用。它也不适用于运行Android 11的Pixel。该承诺返回null。
我尝试过的事情:
使用checkDir()验证目录是否存在使用FileChooser和filePath.resolveNativePath使用android权限READ_EXTERNAL_STORAGE设置为true
这是我的爱奥尼亚信息
离子型:

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

如果您有任何关于我能做些什么来解决这个问题的想法,我将不胜感激。

mnowg1ta

mnowg1ta1#

Android在Android 10(API级别29)中实施了一项新的存储策略,该策略将在Android 11(API级别30)中强制实施,称为“作用域存储”。默认情况下,它会阻止应用访问常规文件系统,在您的情况下是“下载”文件夹。
我建议你重新设计你的系统,不再需要下载文件夹中的信息,因为那里可能有敏感信息,大多数应用程序都不应该访问这些信息。但是,如果你确实需要访问,你必须使用一个新的权限:管理外部存储。
对于Android 10,cordova-plugin-file recently添加了一个标志,以确保操作系统使用旧的文件策略,因此如果您使用的是最新的插件版本,您的代码 * 应该可以正常运行 *。

cordova plugin rm cordova-plugin-file --force

cordova plugin add https://github.com/apache/cordova-plugin-file

订阅related issue了解更多信息。

tzcvj98z

tzcvj98z2#

在我的情况下,我必须添加<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />到我的AndroidManifest.xml,然后我进入设置〉隐私〉权限管理器〉文件和媒体,并在那里搜索我的应用程序,然后当你点击它,你会看到选项“允许管理所有文件”.
你必须手动完成,我还没有找到一种方法来自动化的过程,但我希望你可以使用这个作为一个解决方案。

相关问题