微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android 中从文件 Api 迁移到存储访问框架 (SAF)

如何解决Android 中从文件 Api 迁移到存储访问框架 (SAF)

由于 Android 11 和范围存储,我必须开始使用存储访问框架 (SAF),但我有很多与 File API 一起使用的源代码问题 1:我是否必须重写所有内容才能使用 DocumentFile

伪用例:
用户创建并选择自己的目录,系统返回 Uri:

//Start pick a directory
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)   
startActivityForResult(intent,requestCode)

...

onActivityResult {
    //check requestCode + resultCode
    ...
    //get Uri
    val selectedDir = data.getData();
    if (selectedDir == null) {
        return;
    }
    //take persist permission for later use
    getContentResolver().takePersistableuriPermission(selectedDir,Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}

现在我有 Uri 个由具有读/写持久权限的用户选择的文件夹。

来自Android doc

为了帮助您的应用更顺畅地使用第三方媒体库,Android 11 允许您使用 MediaStore API 以外的 API 通过直接文件路径访问共享存储中的媒体文件。这些 API 包括以下内容
文件 API。
原生库,例如 fopen()

问题 2:好吧,当我有来自 File APIUri 时,我该如何使用 ACTION_OPEN_DOCUMENT_TREE

问题 3:这是否意味着我必须复制所有代码才能使用 requestLegacyExternalStorage 和 Android 11 运行至 Android 9(或带有 File API 的 10) + 与 SAFUri

目标是:使用 File API 保留代码,但获得对用户所选目录的读/写权限。

更新 经过巨大的测试DocumentFile在实践中是不适用的。也许只适用于几个文件
DocumentFile 创建了不必要的复杂源代码,而且非常慢 related topic。 例如在通过 File API ~350 毫秒和通过 DocumentFile ~2300 毫秒期间创建 1000 个目录。删除检查文件是否存在总是很慢。

来自Scoped Storage Recap

太棒了!如果有某种支持库或 Androidx 库来处理文件,那就太好了。

Google 开发者的回答是:

我们正在探索这个选项作为实验,敬请期待?

解决方法

请注意,startActivityForResult() 已弃用。应使用 registerForActivityResult() 代替。不幸的是,我还没有为这种机制找到任何可用的 Java 示例。甚至 Google 的示例代码仍在使用已弃用的功能。我会很高兴得到任何提示。

PS:还有一些 ActivityResultContracts.OpenDocumentTree() 函数可能会有所帮助,但我也找不到如何使用它的示例。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。