0

我目前正在使用颤振保存照片,但出现错误。

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 或更高版本上保存?

4

2 回答 2

0

2021-10-14T22:02:34.9847821.jpg

不要:在文件名中使用禁止字符。

于 2021-10-19T06:54:28.583 回答
0

我认为这发生在 Android 11 中是由于它们的新变化。所以你必须再添加一个权限(manageExternalStorage)。像这样

if (Platform.isAndroid) {

  Map<Permission, PermissionStatus> statuses = await [
  Permission.manageExternalStorage
  ].request();//Permission.manageExternalStorage
}

即使您也必须添加读写权限。

于 2021-10-19T01:44:39.460 回答