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