获得对外部存储的许可(file_provider插件)

Kev*_*ter 1 flutter

我遇到了一些麻烦,无法在Android设备上获得对外部存储的权限。

当我尝试在外部存储中创建目录时,出现此错误(我仅出于本示例更改了目录。在我自己的项目中,目录名称不同):

I/flutter (12727): ??? EXCEPTION CAUGHT BY GESTURE ????????????????????????????????????????????????????????????????????
I/flutter (12727): The following FileSystemException was thrown while handling a gesture:
I/flutter (12727): Creation failed, path = '/storage/emulated/0/com.domain.bundle' (OS Error: Permission denied,
I/flutter (12727): errno = 13)
I/flutter (12727): 
Run Code Online (Sandbox Code Playgroud)

我已经添加
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
到清单文件并重建整个项目。我还能尝试什么?

同样,仅列出外部存储中的所有文件也会产生相同的权限错误。

希望听到!

小智 10

在 Android Q 中,将通过在 AndroidManifest 文件中添加以下行来解决此错误:

 <application
      android:requestLegacyExternalStorage="true"
Run Code Online (Sandbox Code Playgroud)


Tre*_*ree 7

除了需要添加WRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE您的android/app/src/main/AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xxx.yyy">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
...
</manifest>
Run Code Online (Sandbox Code Playgroud)

通过使用simple_permissions包,您还需要Runtime Request Permission

import 'package:simple_permissions/simple_permissions.dart';

PermissionStatus permissionResult = await SimplePermissions.requestPermission(Permission. WriteExternalStorage);
if (permissionResult == PermissionStatus.authorized){
  // code of read or write file in external storage (SD card)
}
Run Code Online (Sandbox Code Playgroud)

注意:

  1. 何时首次运行代码SimplePermissions.requestPermission?应用程序将弹出一个窗口,您必须单击ALLOW

给予许可。

  1. 如果您之前单击过DENY,则可以通过卸载调试应用程序进行调试,然后重新调试以将其安装以修复此->触发弹出窗口,并给您更改为click ALLOW

  • SimplePermissions 插件无法正常工作,不再受支持。 (3认同)
  • 这是行不通的,错误不会消失。请帮我 。我正在使用API​​ 28 android模拟器 (2认同)

chu*_*han 7

请使用包permission_handler来请求权限。
https://pub.dev/packages/permission_handler
https://github.com/BaseflowIT/flutter-permission-handler

import 'package:permission_handler/permission_handler.dart';

...

void _showFilesinDir({Directory dir}) {
    dir.list(recursive: false, followLinks: false)
    .listen((FileSystemEntity entity) {
      print(entity.path);
    });
  }

...

onTap: () async{
            Map<PermissionGroup, PermissionStatus> permissions = await PermissionHandler().requestPermissions([PermissionGroup.storage]);

            var systemTempDir = Directory.systemTemp;
            _showFilesinDir(dir: systemTempDir);

            final myDir = new Directory('/sdcard');
            myDir.exists().then((isThere) {
              isThere ? _showFilesinDir(dir: myDir) : print('non-existent');
            });

          }
...
Run Code Online (Sandbox Code Playgroud)

模拟器的结果如下所示:

I/flutter (19980): /data/user/0/xxx.login_challenge/code_cache/flutter_engine <br>
I/flutter (19980): /data/user/0/xxx.login_challenge/code_cache/login_challengeMSBLSX <br>
...
I/flutter (19980): /sdcard/Android <br>
Run Code Online (Sandbox Code Playgroud)


小智 6

首先你需要在你的

android/app/src/main/AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xxx.yyy">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
...
</manifest>
Run Code Online (Sandbox Code Playgroud)

然后将permission_handler包添加到您的项目Permission_handler - pub.dev

然后在你的代码中你可以做这样的事情:

final permissionStatus = await Permission.storage.status;
if (permissionStatus.isDenied) {
    // Here just ask for the permission for the first time
    await Permission.storage.request();

    // I noticed that sometimes popup won't show after user press deny
    // so I do the check once again but now go straight to appSettings
    if (permissionStatus.isDenied) {
        await openAppSettings();
    }
} else if (permissionStatus.isPermanentlyDenied) {
    // Here open app settings for user to manually enable permission in case 
    // where permission was permanently denied
    await openAppSettings();
} else {
    // Do stuff that require permission here
}
Run Code Online (Sandbox Code Playgroud)