我当前正在使用flutter保存照片,但我收到一个错误。
E/flutter (14379): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: FileSystemException: Cannot open file, path = '/storage/emulated/0/Pictures/FolderName/2021-10-14T22:02:34.9847821.jpg' (OS Error: Operation not permitted, errno = 1)
E/flutter (14379): #0 _File.open.<anonymous closure> (dart:io/file_impl.dart:356:9)
E/flutter (14379): #1 _rootRunUnary (dart:async/zone.dart:1362:47)
E/flutter (14379): #2 _CustomZone.runUnary (dart:async/zone.dart:1265:19)
E/flutter (14379): <asynchronous suspension>
E/flutter (14379): #3 AddGenuineDetailController.saveFileAndroid (package:projectName/controllers/my/addGenuineDetail_controller.dart:55:7)
E/flutter (14379): <asynchronous suspension>
E/flutter (14379):
我想把它保存到那里的路径上并使用它。这是因为它会出现在Gallery应用程序中。但是,在Android 11或更高版本中,文件不会保存到该路径。但是,当保存到安装应用程序的内部存储时,将保存该文件。
当前build.gradle
android {
compileSdkVersion 30
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.company.projectName"
// minSdkVersion 16
minSdkVersion 20
targetSdkVersion 29
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
multiDexEnabled true
}
将目标sdk设置为28没有任何效果。
AndroidManifest.xml应用程序
<application
android:label="projectName"
android:icon="@mipmap/ic_launcher"
android:usesCleartextTraffic="true"
android:requestLegacyExternalStorage="true"
android:preserveLegacyExternalStorage="true"
>
AndroidManifest.xml权限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
<uses-permission android:name="android.permission.REQUEST_COMPANION_USE_DATA_IN_BACKGROUND" />
颤振代码
void saveFileAndroid() async {
final savePath = "/storage/emulated/0/Pictures/ProjectName";
final Directory directory = Directory("$savePath");
print("저장소 유무 : ${await directory.exists()}");
if(await directory.exists() != true){
final Directory _appDocDirNewFolder = await directory.create(recursive: true);
print("저장소 유무 : ${await directory.exists()}");
print(_appDocDirNewFolder.path);
}
int i = 0;
for(var file in certificateList){
i += 1;
var url = Uri.parse(GlobalApiService.getImage(file.path!));
var res = await http.get(url);
String imgName = "${model!.product.createdDate}$i.jpg";
File saveImg = new File('${directory.path}/$imgName');
await saveImg.writeAsBytes(Uint8List.fromList(res.bodyBytes));
}
}
有没有办法在Android 11或更高版本上省钱?
发布于 2021-10-19 01:44:39
我认为这是由于Android 11的新变化造成的。因此,您必须再添加一个权限(manageExternalStorage)。像这样
if (Platform.isAndroid) {
Map<Permission, PermissionStatus> statuses = await [
Permission.manageExternalStorage
].request();//Permission.manageExternalStorage
}
即使你也必须添加读写权限。
发布于 2021-10-19 06:54:29
2021-10-14T22:02:34.9847821.jpg
不要在文件名中使用禁止使用的字符,如:
。
https://stackoverflow.com/questions/69624000
复制相似问题