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

时间:2017-10-11 22:53:01

标签: 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();
    }
  }

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

error.log中

[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"/>

这是什么问题?

5 个答案:

答案 0 :(得分:4)

如果您使用的是Android Q | 10。

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

<application
        android:requestLegacyExternalStorage="true"

答案 1 :(得分:1)

my answer已解决此问题:

使用permission_handler

import 'package:permission_handler/permission_handler.dart';

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

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

希望能帮助身体

答案 2 :(得分:1)

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

#include <cctype>
#include <iostream>
#include <string>
#include <fstream>
#include <ctime>
using namespace std;

#pragma warning(disable : 4996)

int main()
{
    string filename = "textfile.txt";

    ofstream saveloc;
    saveloc.open("\\CppFileHistory\\" + fileName);
    saveloc << "this is some text.\n";
    saveloc.close();
}

还可以在android \ app \ build.gradle中进行这些更改

<application
        android:requestLegacyExternalStorage="true"

它将起作用。

答案 3 :(得分:0)

您可以使用以下两个软件包之一来请求设备许可:https://pub.dartlang.org/packages/simple_permissionshttps://pub.dartlang.org/packages/permission。他们有简单的API和全面的示例。

答案 4 :(得分:0)

如果您正在Android Oreo上进行测试,并且想在外部存储中写入文件,则需要询问WRITE_EXTERNAL_STORAGE

根据“ https://developer.android.com/about/versions/oreo/android-8.0-changes.html#rmp

  

如果该应用定位到Android 8.0(API级别26),则系统仅授予   当时是READ_EXTERNAL_STORAGE;但是,如果应用程序稍后请求   WRITE_EXTERNAL_STORAGE,系统立即授予该特权   而不提示用户。

Permission Plugin仅向Permission.requestPermissions([PermissionName.Storage])申请READ_EXTERNAL_STORAGE权限; 所以您需要索取WRITE_EXTERNAL_STORAGE。

您可以使用我的存储库在pubspec.yaml中询问WRITE_EXTERNAL_STORAGE:

permission:
    git:
    url: https://github.com/kamlesh9070/permission