我有一个可以生成一些 PDF 和 CSV 文件的应用程序,目前我将这些文件保存到 Android 手机应用程序目录中的
files
文件夹中。然后用户需要手动将文件移动到另一个文件夹(例如文档或下载)。
我想在应用程序生成文件后,在运行时自动将文件保存到文档或下载文件夹(两者之一,相同)。目标设备具有 Android 11,因此我在管理外部存储方面遇到任何问题。
Android 清单:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.app.example">
<!-- PERMISSIONS -->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
...
...
启动时请求的权限:
requestPermissions() async {
try {
await [
Permission.storage,
Permission.manageExternalStorage,
].request();
} catch (e) {
LoggerService().error("PERMISSIONS REQUEST ERROR", e.toString());
}
}
文件保存方法:
Future<String> export(Uint8List pdf, {String? fileName}) async {
Directory dir = Directory(EnvironmentService.documentsPath);
String path = "${dir.path}/${fileName ?? "${uuid.v4()}.pdf"}";
File file = File(path);
await file.writeAsBytes(pdf);
return path;
}
我尝试保存文件的路径:
static const String documentsPath = "/storage/emulated/0/Documents";
保存文件时,即使我已授予
OS Error: Operation not permitted, errno = 1)
权限,我总是收到 MANAGE_EXTERNAL_STORAGE
错误。该应用程序不会在 Play 商店上发布,并且只需要在 Android 上运行。
知道发生了什么吗?
您需要向用户请求在 XML 文档中写入的许可。但你不能使用 Flutter 来要求它们,它必须通过 Android 代码来完成。为此,您需要执行以下步骤:
1.- 在 Android 和 Flutter 之间创建通道。 2.- 使用该通道调用请求该权限的 Android 函数。 3.- 用户必须启用该权限。
这是执行此操作的 GIT 存储库:
https://github.com/igarleni/flutter_manage_external_storage
希望对你有帮助!