当我尝试在 Android 11 中读取文件时出现电容文件系统错误

Gab*_*ira 7 android typescript ionic-framework capacitor

readFile我尝试使用电容器文件系统的功能读取模拟器中的文件。我尝试操作它的文件位于模拟器的下载文件夹中,并且该函数返回以下错误:

\n
\n

错误:文件不存在

\n
\n

我还尝试使用复制功能,将此文件复制到可以操作它的目录,但此函数返回此错误:

\n
\n

错误:源对象不存在

\n
\n

我还在应用程序中进行了权限测试,我得到了granted.

\n

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

\n

所有测试均在运行 Android 11 (API30) 的 Pixel 4 模拟器中进行。

\n

在 android.xml 的标签内application,我添加了android:requestLegacyExternalStorage="true", 和user-permissions

\n
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />\n<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />\n<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />\n
Run Code Online (Sandbox Code Playgroud)\n

主页.ts

\n

带副本

\n
// file_dir_path = file:///storage/emulated/0/Download/\n// file_name = file.kml\n// path = \'MyApp/project\' + this.projectId + \'/temp\'\nreturn this.filesystem.copyFileToManegeDirectory(file_dir_path + file_name, path + \'/teste\').then(fileAs64 => {\n    console.log(fileAs64).\n});\n
Run Code Online (Sandbox Code Playgroud)\n

与读

\n
// file_dir_path = file:///storage/emulated/0/Download/\n// file_name = file.kml\nreturn readFile(file_dir_path + file_name).then(fileAs64 => {\n    console.log(fileAs64);\n});\n
Run Code Online (Sandbox Code Playgroud)\n

文件系统服务

\n
/** Copy Files */\n// fileToCopy = file:///storage/emulated/0/Download/file.kml\ncopyFileToManegeDirectory(fileToCopy: string, directoryToGo: string): Promise<any> {\n    return Filesystem.checkPermissions().then(permission => {\n        console.log(permission)\n        return Filesystem.copy({\n            from: fileToCopy,\n            directory: Directory.ExternalStorage,\n            to: directoryToGo,\n            toDirectory: Directory.External\n        }).then(result => {\n            console.log(result);\n        })\n    });\n}\n\n/** Read a file and returns a string base 64 */\nreadFile(path: string): Promise<string> {\n    return Filesystem.readFile({\n        path: path\n    }).then(result => {\n        return result.data;\n    });\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我需要知道是否可以从 Android 11 上的 app\xe2\x80\x99s 范围文件夹中获取文件。我的应用程序需要导入可以存在于设备上任何位置的文件(用户选择从何处)。

\n

离子信息

\n
\n   Ionic CLI                     : 6.15.1-testing.0 (C:\\Users\\Gabriel Vieira\\AppData\\Roaming\\npm\\node_modules\\@ionic\\cli)\n   Ionic Framework               : @ionic/angular 5.6.8\n   @angular-devkit/build-angular : 12.0.2\n   @angular-devkit/schematics    : 12.0.2\n   @angular/cli                  : 12.0.2\n   @ionic/angular-toolkit        : 4.0.0\n\nCapacitor:\n\n   Capacitor CLI      : 3.0.0\n   @capacitor/android : 3.0.0\n   @capacitor/core    : 3.0.0\n   @capacitor/ios     : not installed\n\nUtility:\n\n   cordova-res : 0.15.3\n   native-run  : 1.4.0\n\nSystem:\n\n   NodeJS : v14.16.1 (C:\\Program Files (x86)\\nodejs\\node.exe)\n   npm    : 6.14.12\n   OS     : Windows 10\n
Run Code Online (Sandbox Code Playgroud)\n

npx帽医生

\n
Latest Dependencies:\n\n  @capacitor/cli: 3.0.1\n  @capacitor/core: 3.0.1\n  @capacitor/android: 3.0.1\n  @capacitor/ios: 3.0.1\n\nInstalled Dependencies:\n\n  @capacitor/ios: not installed\n  @capacitor/cli: 3.0.0\n  @capacitor/android: 3.0.0\n  @capacitor/core: 3.0.0\n
Run Code Online (Sandbox Code Playgroud)\n

编辑

\n

尝试将目标SDK更改为28和29,但出现相同的错误。

\n

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

\n

checkPermissions()在使用和测试文件系统权限时requestPermissions(),两个函数都会返回 publicStorage: \'granted\'。

\n

Joa*_*los 4

如果您将正确的目标放入其中,android/variables.gradle它应该可以正常工作,如果没有,您必须在 Capacitor GitHub 页面中提出问题。

ext {
    compileSdkVersion = 29
    targetSdkVersion = 29
    ...
}
Run Code Online (Sandbox Code Playgroud)

而且你不应该使用 MANAGE_EXTERNAL_STORAGE 除非你有充分的理由,否则在 Google Play 商店中部署它可能会很麻烦,请参阅Google 的支持页面以获取更多详细信息。在您的 AndroidManifest 中也保留参数android:requestLegacyExternalStorage="true",并添加用户权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)

  • 我正在使用 Capacitor 4.x,不幸的是,现在所需的最低 Sdk 版本是 32。我无法使用 Capacitor Filesystem 插件读取代码中的文件,出现权限被拒绝错误。有任何想法吗?这个范围存储业务一团糟。 (2认同)