Flutter:共享存储(存储访问框架API)隐藏子目录中文件的权限不起作用
Flutter: Shared Storage (Storage Access Framework API) Permission for files inside hidden sub-directory not working
如何实现列出隐藏子目录中的所有文件(例如媒体),即文件夹名称以 '.' 开头,例如“(.media)”在 Flutter/Dart?
中使用 SAF 后
我已经使用 ACTION_OPEN_DOCUMENT_TREE 让用户选择一个文件夹 [所以为了避免使用 MANAGE_EXTERNAL_STORAGE] 但无法查看即读取文件在文件夹的隐藏子目录中。
已授予权限的文件夹是 media:
storage/emulated/0/internal storage/Android/media/matrix/.new/
问题:
无法列出子文件夹 .new
中的所有文件
同时...
能够访问 matrix 子文件夹
中的文件(不是文件夹)
此外,如果我将子文件夹 ".new" 重命名为 new 我可以列出该文件夹中的所有文件
我正在使用 flutter/dart。对于共享存储权限,我使用了 Kotlin 自定义本机代码。
科特林代码:
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine)
MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
.setMethodCallHandler{ call: MethodCall, result: MethodChannel.Result -> run {
if (call.method.contentEquals("getSAFPermission")) {
if (VERSION.SDK_INT > 29) {
openDirectory(_initialPickerDirPath) //@String path
} else {
result.success(true)
}
}
}
}
}
private fun openDirectory(pickerInitialUri: String) {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply {
putExtra(DocumentsContract.EXTRA_INITIAL_URI,DocumentsContract.buildDocumentUri(
"com.android.externalstorage.documents", pickerInitialUri)
}
startActivityForResult(intent, SAF_PERMISSION_CODE)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
if (requestCode == SAF_PERMISSION_CODE && resultCode == Activity.RESULT_OK) {
val contentResolver = applicationContext.contentResolver
val takeFlags: Int = (Intent.FLAG_GRANT_READ_URI_PERMISSION or
Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
contentResolver.takePersistableUriPermission(treeUri, takeFlags)
}
}
扑面| 飞镖代码:
_loadimage() async {
// path: '/storage/emulated/0/Android/media/neo/matrix/.new'
if (Directory(_neoDir.path).existsSync()) { // _neoDir: Directory
imageList += _neodDir
.listSync()
.map((item) => item.path)
.where((item) => item.endsWith(".jpg"))
.toList(growable: false); // imageList appear empty list
}
}
尝试过的方法:
1. 在本机 Kotlin 端,使用 CachingDocumentFile 获取子文档文件并遍历所有 DocumentFile 并将 Uri 列表存储在字符串中并将其发送回扑面。在飞镖侧渲染图像 File.fromUri() (Flutter)
参考->https://github.com/android/storage-samples/tree/main/ActionOpenDocumentTree
2. 使用了这些人的解决方案。参考 > https://github.com/lakscastro/shared-storage/issues/10#issuecomment-1025801272
我觉得我没有获得子文档文件的读取权限。
注意:- 截至 2022 年 1 月 31 日 没有 flutter 包有助于实现此功能。 尝试了给定的包 :
shared_storage, > https://pub.dev/packages/shared_storage
file_picker, > https://pub.dev/packages/file_picker
filesystem_picker, > https://pub.dev/packages/filesystem_picker
FileManager(已停产class)
如有任何帮助,我们将不胜感激。
终于找到可以解决SAF问题的包了!
这是一个 link
Visit
如何实现列出隐藏子目录中的所有文件(例如媒体),即文件夹名称以 '.' 开头,例如“(.media)”在 Flutter/Dart?
中使用 SAF 后我已经使用 ACTION_OPEN_DOCUMENT_TREE 让用户选择一个文件夹 [所以为了避免使用 MANAGE_EXTERNAL_STORAGE] 但无法查看即读取文件在文件夹的隐藏子目录中。
已授予权限的文件夹是 media:
storage/emulated/0/internal storage/Android/media/matrix/.new/
问题:
无法列出子文件夹 .new
中的所有文件同时...
能够访问 matrix 子文件夹
中的文件(不是文件夹)此外,如果我将子文件夹 ".new" 重命名为 new 我可以列出该文件夹中的所有文件
我正在使用 flutter/dart。对于共享存储权限,我使用了 Kotlin 自定义本机代码。
科特林代码:
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine)
MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
.setMethodCallHandler{ call: MethodCall, result: MethodChannel.Result -> run {
if (call.method.contentEquals("getSAFPermission")) {
if (VERSION.SDK_INT > 29) {
openDirectory(_initialPickerDirPath) //@String path
} else {
result.success(true)
}
}
}
}
}
private fun openDirectory(pickerInitialUri: String) {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply {
putExtra(DocumentsContract.EXTRA_INITIAL_URI,DocumentsContract.buildDocumentUri(
"com.android.externalstorage.documents", pickerInitialUri)
}
startActivityForResult(intent, SAF_PERMISSION_CODE)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
if (requestCode == SAF_PERMISSION_CODE && resultCode == Activity.RESULT_OK) {
val contentResolver = applicationContext.contentResolver
val takeFlags: Int = (Intent.FLAG_GRANT_READ_URI_PERMISSION or
Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
contentResolver.takePersistableUriPermission(treeUri, takeFlags)
}
}
扑面| 飞镖代码:
_loadimage() async {
// path: '/storage/emulated/0/Android/media/neo/matrix/.new'
if (Directory(_neoDir.path).existsSync()) { // _neoDir: Directory
imageList += _neodDir
.listSync()
.map((item) => item.path)
.where((item) => item.endsWith(".jpg"))
.toList(growable: false); // imageList appear empty list
}
}
尝试过的方法:
1. 在本机 Kotlin 端,使用 CachingDocumentFile 获取子文档文件并遍历所有 DocumentFile 并将 Uri 列表存储在字符串中并将其发送回扑面。在飞镖侧渲染图像 File.fromUri() (Flutter)
参考->https://github.com/android/storage-samples/tree/main/ActionOpenDocumentTree
2. 使用了这些人的解决方案。参考 > https://github.com/lakscastro/shared-storage/issues/10#issuecomment-1025801272
我觉得我没有获得子文档文件的读取权限。
注意:- 截至 2022 年 1 月 31 日 没有 flutter 包有助于实现此功能。 尝试了给定的包 :
shared_storage, > https://pub.dev/packages/shared_storage
file_picker, > https://pub.dev/packages/file_picker
filesystem_picker, > https://pub.dev/packages/filesystem_picker
FileManager(已停产class)
如有任何帮助,我们将不胜感激。
终于找到可以解决SAF问题的包了! 这是一个 link Visit