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

8fq7wneg  于 2023-04-28  发布在  Android
关注(0)|答案(2)|浏览(165)

我试图创建一个由Flutter应用程序生成的新JSON文件,我想让用户选择存储该文件的位置。
我目前使用file_picker包让用户选择路径来存储生成的文件。如果我选择Documents文件夹(/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的模拟器上运行我的应用。我还尝试在Manifest中添加此权限:

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

并尝试使用软件包permission_handler请求存储权限,但没有任何变化。

vwkv1x7d

vwkv1x7d1#

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.
    }
  }
zpgglvta

zpgglvta2#

如果您的目标是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

相关问题