无法使用 Flutter 在 Documents 文件夹外创建新文件

问题描述 投票:0回答:3

我正在尝试创建一个由我的 Flutter 应用程序生成的新 JSON 文件,我想让用户选择存储该文件的位置。

我目前正在使用

file_picker
包让用户选择存储生成文件的路径。如果我选择文档文件夹 (
/storage/emulated/0/Documents
) 我可以创建该文件,但如果我选择另一个路径(例如
/storage/emulated/0/DCIM
或由名为
Test
的用户创建的自定义文件夹)我得到以下异常:
FileSystemException: Cannot open file, path = '/storage/emulated/0/Test/backup.json' (OS Error: Operation not permitted, errno = 1)

请注意,我在搭载 Android 13 的模拟器上运行我的应用程序。我还尝试在清单中添加此权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

并尝试使用包请求存储权限

permission_handler
但没有任何改变。

android flutter android-permissions
3个回答
0
投票

DCIM 可能是媒体或照片的一部分

所以如果可行的话试试这个,我通常会在我的清单中包含

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 // try to add this 2 lines
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
 // Optional to add this 
 <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION"/>

像这样设置我的 gradle

  android {
     compileSdkVersion 33
     ....
     // from deafult config 
     defaultConfig{
      ...
      mindSdkVersion 28
      targetSdkVersion 33

  }

然后为了获得许可,您可以将它们放在列表中以防万一请求

 // You can either call this in initState or any listener you have
 // as long ass it can be triggered first on page
 static Future<void> requestStorageorPhotos() async{
    await [
       Permission.photos,
       Permission.storage,
     ].request();
    // try to listen from its changes permission
    if((await Permission.photos.status.isGranted) || (await 
      Permission.storage.status.isGranted)){
      // Do your thing if allow
    }else{
     // or anything in here from not allowing it.
    }
  }

0
投票

如果您的目标是 Android 11 及更高版本(targetSdkVersion 30),那么您需要在 AndroidManifest.xml 中具有以下权限以进行修改和文档访问。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="28" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

您可以在此处找到更多详细信息 https://stackoverflow.com/a/66366102/19292778


0
投票

您的应用程序不需要 Android 13 设备上的任何权限即可在所有公共目录中创建文件。

但是 .. 在 DCIM 和 Picture 文件夹中你只能创建图像文件。在音频和音乐中只有音乐文件等。

只有在 Documents 和 Download 目录下你可以创建所有类型的文件。

© www.soinside.com 2019 - 2024. All rights reserved.