【问题标题】:Permission denied at ExternalStorageDirectory access via Flutter plugin通过 Flutter 插件访问 ExternalStorageDirectory 的权限被拒绝
【发布时间】:2021-01-26 18:08:38
【问题描述】:

我写了一个插件来通过 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();
    }
  }

返回的路径是正确的storage/emulated/0。但是现在如果我尝试迭代抛出目录,我会得到一个 Permission denied。

错误日志

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

main.dart

  path = await Userdatadirectory.getUserDataDirectory;

    var dir = new Directory(path);

    List contents = dir.listSync();
    for (var fileOrDir in contents) {
      print(fileOrDir.path);
    }

我的example/android/app/src/AndroidManifest.xml 包含这些额外的权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

这里有什么问题?

【问题讨论】:

  • 好的,但现在我有一个问题,我不能访问活动,所以我不能调用 requestPermission()。那么是否可以在 Flutter 插件项目中获取 Context 或 Activity 呢?以及如何?
  • 我正在尝试访问 /storage/emulated/ 目录但收到错误“未处理的异常:FileSystemException:目录列表失败,路径 = '/storage/emulated/'(操作系统错误:权限被拒绝,errno = 13)" 虽然我已授予 WRITE_EXTERNAL_STORAGE 和 READ_EXTERNAL_STORAGE 权限。任何建议。谢谢。

标签: android dart flutter


【解决方案1】:

如果您使用的是 Android Q,就会发生这种情况 | 10.

在清单文件中添加以下内容即可解决。

<application
        android:requestLegacyExternalStorage="true"

【讨论】:

  • 这正是我想要的答案。非常感谢。
【解决方案2】:

使用permission_handler

import 'package:permission_handler/permission_handler.dart';

在下载操作之前,您需要检查存储权限:

var status = await Permission.storage.status;
if (!status.isGranted) {
   await Permission.storage.request();
}

希望对身体有所帮助

【讨论】:

  • 如果用户拒绝会怎样?是否有“如果拒绝则退出应用程序”选项?
  • 这是工作,但还需要另一个答案,比如在 androidManifest.xml 上设置
【解决方案3】:

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

【讨论】:

【解决方案4】:

在 AndroidManifest.xml 中添加以下内容:

<application
        android:requestLegacyExternalStorage="true"

同样在 android\app\build.gradle 中进行这些更改

compileSdkVersion 29

targetSdkVersion 29

它会起作用的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 2019-03-20
    • 2021-10-31
    • 2014-06-03
    相关资源
    最近更新 更多