我目前正在使用 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):
我想把它保存到那邊的路徑并使用它。那是因為它出現在圖庫應用程式中。但是,在 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 或更高版本上保存?
uj5u.com熱心網友回復:
我認為這是由于 Android 11 的新變化而發生的。因此,您必須再添加一項權限(manageExternalStorage)。像這樣
if (Platform.isAndroid) {
Map<Permission, PermissionStatus> statuses = await [
Permission.manageExternalStorage
].request();//Permission.manageExternalStorage
}
甚至您還必須添加讀寫權限。
uj5u.com熱心網友回復:
2021-10-14T22:02:34.9847821.jpg
不要:在檔案名中使用禁止字符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/326734.html
