通过Flutter插件在ExternalStorageDirectory访问时拒绝权限

Luk*_*ner 6 android dart flutter

我编写了一个插件,用于通过Dart访问Android上的ExternalStorageDirectory。

插件的android特定代码:

@Override
  public void onMethodCall(MethodCall call, Result result) {
    if (call.method.equals("getUserDataDirectory")) {
      String path = Environment.getExternalStorageDirectory().getAbsolutePath();
      result.success(path);
    } else {
      result.notImplemented();
    }
  }
Run Code Online (Sandbox Code Playgroud)

返回的路径是正确的storage/emulated/0。但是现在,如果我尝试迭代抛出目录,我将获得一个权限被拒绝。

错误日志

[ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter ( 3381): FileSystemException: Directory listing failed, path = '/storage/emulated/0/' (OS Error: Permission denied, errno = 13)
E/flutter ( 3381): #0      _Directory._fillWithDirectoryListing (dart:io-patch/directory_patch.dart:32)
E/flutter ( 3381): #1      _Directory.listSync (directory_impl.dart:214)
E/flutter ( 3381): #2      _MyAppState.initPathRequest (/data/user/0/com.yourcompany.userdatadirectoryexample/cache/exampleIAKNFP/example/lib/main.dart:34:25)
Run Code Online (Sandbox Code Playgroud)

主镖

  path = await Userdatadirectory.getUserDataDirectory;

    var dir = new Directory(path);

    List contents = dir.listSync();
    for (var fileOrDir in contents) {
      print(fileOrDir.path);
    }
Run Code Online (Sandbox Code Playgroud)

example/android/app/src/AndroidManifest.xml包含以下附加要求:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
Run Code Online (Sandbox Code Playgroud)

这里有什么问题?

Tej*_*oid 5

如果您使用的是 Android Q,它就会发生| 10.

它将通过在清单文件中添加以下内容来解决。

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

  • 这就是我想要的确切答案。非常感谢。 (2认同)

Tru*_*inh 2

您可以使用这两个包中的任何一个来请求设备权限:https://pub.dartlang.org/packages/simple_permissionshttps://pub.dartlang.org/packages/permission。它们有简单的 API 和全面的示例。