flutter 获取外部存储的权限(file_provider插件)

qoefvg9y  于 2023-03-31  发布在  Flutter
关注(0)|答案(9)|浏览(702)

我有一些问题,获得权限的外部存储在android设备与Flutter。
当我尝试在我的外部存储中创建一个目录时,我得到了这个错误(我只是为了这个例子而改变了目录。在我自己的项目中,目录名是不同的):

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):

我已经加了
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
到清单文件并重建整个项目。我还可以尝试什么?
此外,仅列出外部存储中的所有文件也会产生相同的权限错误。
希望听到!

mwyxok5s

mwyxok5s1#

除了需要将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>

您还需要运行时请求权限,使用simple_permissions包:

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)
}

注意事项:
1.* * 第一次**运行SimplePermissions.requestPermission时,app会弹出一个窗口,必须点击ALLOW

给予许可
1.如果你已经点击了DENY,然后卸载调试应用程序并重新调试它来安装和修复这个-〉触发弹出窗口,给予你有机会点击ALLOW

ioekq8ef

ioekq8ef2#

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

<application
      android:requestLegacyExternalStorage="true"
e5nszbig

e5nszbig3#

请使用package 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');
            });

          }
...

模拟器的结果看起来像这样:

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>
ozxc1zmp

ozxc1zmp4#

对于Android 6.0及更高版本,如果应用具有需要Dangerous权限(危险权限列表)的功能,则必须明确询问权限(请查看图片here
您添加了对Manifest文件的权限,这还不够,您还需要为您的权限实现运行时请求。
我检查了Flutter仓库,似乎他们正在为此开发一个插件。这里是their discussion

qco9c6ql

qco9c6ql5#

可能的解决方案:
我也得到了同样的错误(在Android 10设备),即使在添加权限后
然后我,从设备上手动卸载Flutter应用程序,
并重新运行。
注意:安装完成后,请确保在应用设置中允许存储权限
在挣扎了几个小时之后,它对我有效(我不知道为什么这个解决方案有效)

6tqwzwtp

6tqwzwtp6#

可以这样使用permission_handler包提供的运行时请求权限:

await PermissionHandler().requestPermissions([PermissionGroup.storage]);

和要确保授予正确的权限,请使用以下示例代码:

ServiceStatus serviceStatus = await 
PermissionHandler().checkServiceStatus(PermissionGroup.storage);
if (serviceStatus.value == 1){
// permission is granted
}
7eumitmz

7eumitmz7#

你们只需要加上媒体许可

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

只需将这些文件添加到manifest内部,外部权限对于旧版本的Android具有。

sy5wg1nm

sy5wg1nm8#

在我的情况下,我使用file_picker只是从file_picker更改插件的版本:^4.6.1到file_picker:5.2.6,工作正常。

fcipmucu

fcipmucu9#

首先你需要把这个放在你的
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>

然后将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
}

相关问题