首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我试图读取Android 11中的文件时,电容器文件系统出错

当我试图读取Android 11中的文件时,电容器文件系统出错
EN

Stack Overflow用户
提问于 2021-06-16 16:37:44
回答 1查看 2.6K关注 0票数 5

我试图使用函数电容文件系统在模拟器中读取一个文件。我试图操作的文件位于模拟器的下载文件夹中,函数返回以下错误:

错误:文件不存在

我还尝试使用复制函数,将该文件复制到我可以操作它的目录中,但是这个函数返回这个错误:

错误:源对象不存在

此外,我还对应用程序中的权限进行了测试,我在应用程序中获得了granted

我在网上搜索了这个错误,但没有成功。此外,我还在文件系统服务的函数上使用了Directory的所有参数,但是所有选项都会返回相同的错误。在相同的参数下,可以访问android 10中的文件系统。

所有的测试都是在仿真器Pixel 4和Android11 (API30)中进行的。

在android.xml中,在标记application中,我添加了android:requestLegacyExternalStorage="true",在user-permissions中添加了

代码语言:javascript
复制
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

homePage.ts

带复本

代码语言:javascript
复制
// file_dir_path = file:///storage/emulated/0/Download/
// file_name = file.kml
// path = 'MyApp/project' + this.projectId + '/temp'
return this.filesystem.copyFileToManegeDirectory(file_dir_path + file_name, path + '/teste').then(fileAs64 => {
    console.log(fileAs64).
});

带读

代码语言:javascript
复制
// file_dir_path = file:///storage/emulated/0/Download/
// file_name = file.kml
return readFile(file_dir_path + file_name).then(fileAs64 => {
    console.log(fileAs64);
});

FilesystemService

代码语言:javascript
复制
/** Copy Files */
// fileToCopy = file:///storage/emulated/0/Download/file.kml
copyFileToManegeDirectory(fileToCopy: string, directoryToGo: string): Promise<any> {
    return Filesystem.checkPermissions().then(permission => {
        console.log(permission)
        return Filesystem.copy({
            from: fileToCopy,
            directory: Directory.ExternalStorage,
            to: directoryToGo,
            toDirectory: Directory.External
        }).then(result => {
            console.log(result);
        })
    });
}

/** Read a file and returns a string base 64 */
readFile(path: string): Promise<string> {
    return Filesystem.readFile({
        path: path
    }).then(result => {
        return result.data;
    });
}

我需要知道是否有可能从Android 11上的应用程序的作用域文件夹中获取文件。我的应用程序需要导入设备上任何地方都可以存在的文件(用户选择从哪里)。

离子信息

代码语言:javascript
复制
   Ionic CLI                     : 6.15.1-testing.0 (C:\Users\Gabriel Vieira\AppData\Roaming\npm\node_modules\@ionic\cli)
   Ionic Framework               : @ionic/angular 5.6.8
   @angular-devkit/build-angular : 12.0.2
   @angular-devkit/schematics    : 12.0.2
   @angular/cli                  : 12.0.2
   @ionic/angular-toolkit        : 4.0.0

Capacitor:

   Capacitor CLI      : 3.0.0
   @capacitor/android : 3.0.0
   @capacitor/core    : 3.0.0
   @capacitor/ios     : not installed

Utility:

   cordova-res : 0.15.3
   native-run  : 1.4.0

System:

   NodeJS : v14.16.1 (C:\Program Files (x86)\nodejs\node.exe)
   npm    : 6.14.12
   OS     : Windows 10

npx帽子医生

代码语言:javascript
复制
Latest Dependencies:

  @capacitor/cli: 3.0.1
  @capacitor/core: 3.0.1
  @capacitor/android: 3.0.1
  @capacitor/ios: 3.0.1

Installed Dependencies:

  @capacitor/ios: not installed
  @capacitor/cli: 3.0.0
  @capacitor/android: 3.0.0
  @capacitor/core: 3.0.0

编辑

试图将目标SDK更改为28和29,但也出现了同样的错误。

文档说,当我需要访问作用域存储之外的文件时,添加标记MANAGE_EXTERNAL_STORAGE,但是这个参数已经包含在我的清单中,即使这样,我也不允许读取作用域存储之外的任何内容。

在使用checkPermissions()requestPermissions()测试文件系统权限时,这两个函数都返回publicStorage:‘授予’。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-22 18:24:35

如果您将正确的目标放在android/variables.gradle中,它应该正常工作,如果没有,则必须在电容GitHub页面中打开一个问题。

代码语言:javascript
复制
ext {
    compileSdkVersion = 29
    targetSdkVersion = 29
    ...
}

而且你不应该使用MANAGE_EXTERNAL_STORAGE,除非你有一个很好的理由,它可能成为一个麻烦部署在谷歌游戏商店,请参阅谷歌支持页面的更多细节。在您的AndroidManifest中,还保留参数android:requestLegacyExternalStorage="true",并添加用户权限:

代码语言:javascript
复制
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68006813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档