我写了一个插件,通过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"/>
这是什么问题?
答案 0 :(得分:4)
如果您使用的是Android Q | 10。
这将通过在清单文件中添加以下内容来解决。
<application
android:requestLegacyExternalStorage="true"
答案 1 :(得分:1)
my answer已解决此问题:
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_permissions或https://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