存储权限请求在 Flutter 中不起作用

gij*_*676 11 android dart flutter

我正在尝试从 Flutter 访问 Android 模拟器(SDK 33)上的存储。这是我正在测试它的代码:


void test() async {
     PermissionStatus storageStatus = await Permission.storage.request();
     if (storageStatus == PermissionStatus.granted) {
         print("granted");
     }
     if (storageStatus == PermissionStatus.denied) {
         print("denied");
     }
     if (storageStatus == PermissionStatus.permanentlyDenied) {
         openAppSettings();
     }
 }

Run Code Online (Sandbox Code Playgroud)

我已在 AndroidManifest.xml 中包含“android.permission.WRITE_EXTERNAL_STORAGE”权限。

我尝试授予相机权限并且它有效,但它不适用于存储。

当我检查存储权限状态时,它被永久拒绝,并且当应用程序的设置打开时,它显示“没有请求权限”。

我尝试运行“flutter clean”,这在更新清单时似乎是必要的。

我尝试过从手机卸载并重新安装该应用程序

我如何解决它?

Gir*_*ldi 5

由于您使用的是Android 版本 13(或 SDK 33),因此无需请求存储权限,因为应用程序默认可以访问这些文件。

\n

因此,除了检查存储权限外,还要使用device_info_plus库检查SDK版本是否早于33。

\n
void test() async {\n  final plugin = DeviceInfoPlugin();\n  final android = await plugin.androidInfo;\n\n  final storageStatus = android.version.sdkInt < 33\n      ? await Permission.storage.request()\n      : PermissionStatus.granted;\n\n  if (storageStatus == PermissionStatus.granted) {\n    print("granted");\n  }\n  if (storageStatus == PermissionStatus.denied) {\n    print("denied");\n  }\n  if (storageStatus == PermissionStatus.permanentlyDenied) {\n    openAppSettings();\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

不要忘记导入device_info_plus

\n
import \'package:device_info_plus/device_info_plus.dart\';\n
Run Code Online (Sandbox Code Playgroud)\n

进一步阅读:

\n\n


小智 2

一旦尝试这样做。

添加到您的清单中

<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"/>
Run Code Online (Sandbox Code Playgroud)

用于请求许可。

Future<bool> requestPermission(Permission permission) async {
  if (await permission.isGranted) {
    return true;
  } else {
    var result = await permission.request();
    if (result == PermissionStatus.granted) {
      return true;
    }
  }
  return false;
}
Run Code Online (Sandbox Code Playgroud)

为了检查权限,您还可以根据需要更改对话框文本

Future<bool> checkPermission() async {
    ///For Check permission..
    if (Platform.isAndroid ? !await requestPermission(Permission.storage) && !await requestPermission(Permission.manageExternalStorage) : !await requestPermission(Permission.storage)) {
      await Get.dialog(CupertinoAlertDialog(
        title: const Text("Photos & Videos permission"),
        content: const Text(" Photos & Videos permission should be granted to connect with device, would you like to go to app settings to give Bluetooth & Location permissions?"),
        actions: <Widget>[
          TextButton(
              child: const Text('No thanks'),
              onPressed: () {
                Get.back();
              }),
          TextButton(
              child: const Text('Ok'),
              onPressed: () async {
                Get.back();
                await openAppSettings();
              })
        ],
      ));
      return false;
    } else {
      return true;
    }
  }
Run Code Online (Sandbox Code Playgroud)

像这样使用

我希望这些事情能解决您的问题。

  • 不知何故,这在模拟器上不起作用。但它可以在实际设备上运行。有什么想法吗? (2认同)