首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在flutter Android11中使用文件writeAsBytes时出错,有没有其他方法可以工作?

在flutter Android11中使用文件writeAsBytes时出错,有没有其他方法可以工作?
EN

Stack Overflow用户
提问于 2021-10-19 00:56:19
回答 2查看 312关注 0票数 0

我当前正在使用flutter保存照片,但我收到一个错误。

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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应用程序

代码语言:javascript
运行
复制
<application
        android:label="projectName"
        android:icon="@mipmap/ic_launcher"
        android:usesCleartextTraffic="true"
        android:requestLegacyExternalStorage="true"
        android:preserveLegacyExternalStorage="true"
        >

AndroidManifest.xml权限

代码语言:javascript
运行
复制
    <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" />

颤振代码

代码语言:javascript
运行
复制
  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或更高版本上省钱?

EN

回答 2

Stack Overflow用户

发布于 2021-10-19 01:44:39

我认为这是由于Android 11的新变化造成的。因此,您必须再添加一个权限(manageExternalStorage)。像这样

代码语言:javascript
运行
复制
if (Platform.isAndroid) {

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

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

票数 0
EN

Stack Overflow用户

发布于 2021-10-19 06:54:29

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

不要在文件名中使用禁止使用的字符,如:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69624000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档