Flutter:共享存储(存储访问框架 API)隐藏子目录内文件的权限不起作用

jvo*_*tci 5 hidden android dart kotlin flutter

如何实现列出隐藏子目录中的所有文件(例如媒体),即文件夹名称以“.”开头 例如在 Flutter/Dart 中使用 SAF 后的“ (.media) ”?

我已经使用 ACTION_OPEN_DOCUMENT_TREE 让用户选择一个文件夹[因此避免使用 MANAGE_EXTERNAL_STORAGE]但无法查看即读取该文件夹的隐藏子目录内的文件。

授予权限的文件夹是media

存储/模拟/0/内部存储/Android/媒体/matrix/.new/

问题:

无法列出子文件夹.new中的所有文件

同时...

能够访问矩阵子文件夹内的文件(不是文件夹)

另外,如果我将子文件夹“.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)
          }
}
Run Code Online (Sandbox Code Playgroud)

扑面| 飞镖代码

_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
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试过的方法:

1. 在原生 Kotlin 端,使用 CachingDocumentFile 获取子文档文件并迭代所有 DocumentFile 并将 Uri 列表存储在字符串中并将其发送回 Flutter 端。在 dart 端渲染图像 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 包有助于实现此功能。尝试过给定的包

共享存储,> https://pub.dev/packages/shared_storage

file_picker,> https://pub.dev/packages/file_picker

filesystem_picker,> https://pub.dev/packages/filesystem_picker

文件管理器已停产的类

任何帮助将不胜感激。

Ank*_*mar 1

终于我找到了一个可以解决SAF问题的包!这是一个链接 访问