我正在尝试创建一个由我的 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
但没有任何改变。
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.
}
}
如果您的目标是 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
您的应用程序不需要 Android 13 设备上的任何权限即可在所有公共目录中创建文件。
但是 .. 在 DCIM 和 Picture 文件夹中你只能创建图像文件。在音频和音乐中只有音乐文件等。
只有在 Documents 和 Download 目录下你可以创建所有类型的文件。