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

问题描述 投票:0回答:2

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

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

授予权限的文件夹是media

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

问题:

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

同时...

能够访问matrix子文件夹

内的文件(不是文件夹)

此外,如果我将子文件夹“.new”重命名为new,我可以列出该文件夹中的所有文件

我正在使用 flutter/dart。对于共享存储权限,我使用了 Kotlin 自定义本机代码。

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 列表存储在字符串中并将其发送回 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 包有助于实现此功能。 尝试过给定的软件包

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

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

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

文件管理器已停课

任何帮助将不胜感激。

android flutter kotlin dart hidden
2个回答
1
投票
终于找到一个可以解决SAF问题的包了! 这是一个链接

参观


0
投票
有关于 SAF 的例子吗?我无法打开文档文件夹

© www.soinside.com 2019 - 2024. All rights reserved.