我在经过大量的搜索和测试后找到了适用于任何Android版本的方法。
自Android 13发布后,出现了一个重大变化。
在Android 13+上,请求"storage"权限总是返回"denied"。我该怎么办?
在Android上,Permission.storage权限与Android的READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限相关联。从Android 10(API 29)开始,READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限已被标记为弃用,并且自Android 13(API 33)起已完全移除/禁用。
如果您的应用程序需要访问媒体文件,Google建议使用READ_MEDIA_IMAGES、READ_MEDIA_VIDEOS或READ_MEDIA_AUDIO权限。可以使用Permission.photos、Permission.videos和Permission.audio来请求这些权限。要请求这些权限,请确保android/app/build.gradle文件中的compileSdkVersion设置为33。
如果您的应用程序需要访问Android的文件系统,可以请求MANAGE_EXTERNAL_STORAGE权限(使用Permission.manageExternalStorage)。自Android 11(API 30)起,MANAGE_EXTERNAL_STORAGE权限被视为高风险或敏感权限。因此,如果您打算通过Google Play商店发布应用程序,必须声明使用这些权限。
了解更多...
在您的清单文件中添加以下内容:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
在标签中还要添加
android:requestLegacyExternalStorage="true"这一行。
<application
android:requestLegacyExternalStorage="true" // add here
android:label="iFlutter"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"
android:enableOnBackInvokedCallback="true"
>
注意
在这里,我们在Android版本13及以下的清单中管理请求,但问题仍然是如何识别和使用所有设备(任何Android版本)的权限。
在这里,我们使用了最新版本的permission_handler和device_info_plus。
现在我创建了一个方法,可以处理任何Android版本的存储权限。
Future<bool> storagePermission() async {
final DeviceInfoPlugin info = DeviceInfoPlugin();
final AndroidDeviceInfo androidInfo = await info.androidInfo;
debugPrint('releaseVersion : ${androidInfo.version.release}');
final int androidVersion = int.parse(androidInfo.version.release);
bool havePermission = false;
if (androidVersion >= 13) {
final request = await [
Permission.videos,
Permission.photos,
].request();
havePermission = request.values.every((status) => status == PermissionStatus.granted);
} else {
final status = await Permission.storage.request();
havePermission = status.isGranted;
}
if (!havePermission) {
await openAppSettings();
}
return havePermission;
}
如何使用
onPressed: () async {
final permission = await storagePermission();
debugPrint('permission : $permission');
},
希望这能对你有所帮助。