Flutter 安卓文件访问权限一览 (2023-02-15)

Android [2,6)

在早期版本的安卓系统中,应用程序可以自由地访问设备上的所有文件和目录,没有任何限制。

直接在清单中写清读写权限。

    <uses-permission
        android:name="android.permission.READ_EXTERNAL_STORAGE"
        android:maxSdkVersion="32" />

    <uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        android:maxSdkVersion="29" />
 

Android [6, 10)

随着 Android 6.0 的发布,Google 引入了一种称为“运行时权限”的新的权限管理方式,允许用户在运行时授予或拒绝应用程序对特定权限的访问请求。这些权限包括存储空间、照相机、麦克风等。

动态申请读写权限。

List<Permission> permissions = [
  Permission.storage
];
permissions.request();

Android [10, 12]

在 Android 10 中,Google 进一步加强了文件访问权限的管理,引入了一种新的存储访问框架,称为 Scoped Storage(作用域存储)。Scoped Storage 强制应用程序访问其私有文件和存储目录,同时通过使用新的 MediaStore API,应用程序可以访问公共存储空间中的音频、视频和图像文件。

对于 Android 10 版本你可以像下面这样在清单中声明使用旧代的权限制度:

android:requestLegacyExternalStorage="true"

对于 10~13 版本,

在And使用 SAF (Storage Access Framework, 存储访问框架),来申请对某个文件夹的读写权限。

import 'package:saf/saf.dart';

bool? isGranted = await Saf(_dir).getDirectoryPermission();

暴力

对于 Android [6, 12],你可以无视谷歌所有的文件访问的策略,直接在清单中声明 MANAGE_EXTERNAL_STORAGE,表明你希望获取对 EXTERNAL_STORAGE 的所有文件的访问权限。

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>

然后动态申请权限

List<Permission> permissions = [
  Permission.manageExternalStorage,
];
permissions.request();