【问题标题】:Random access write to SAF file on Android在 Android 上随机访问写入 SAF 文件
【发布时间】:2021-03-04 00:24:42
【问题描述】:

我正在尝试对从 Android Storage Access Framework 检索到的流实施“随机访问”写入。

在我的场景中,我使用 OPEN_DOCUMENT 意图选择一个文件,它给了我一个文档 URI。然后我可以使用ContentResolveropenOutputStream。不过,从那时起,我看不到有一种方法可以在流中“寻找”以写入文件中的给定位置。

有没有办法实现这一点(至少对于本地存储/基于 SD 卡的文件)?

【问题讨论】:

    标签: java android stream storage-access-framework


    【解决方案1】:

    至少对于本地存储/基于 SD 卡的文件

    你不知道这就是你得到的。用户可以选择自己想要的任何文档提供程序(例如 Google Drive)。

    我看不到在流中“寻找”以写入文件中给定位置的方法

    部分原因是 Java 流很糟糕。但是,主要是为了文档提供者的灵活性。假设用户选择了一个在本地存储其内容但由流密码加密的提供者。然后你不能随便跳到某个任意点——数据必须一路解密。

    AFAIK,您唯一的选择是将内容复制到您控制的某个文件中,之后您可以随机访问该文件。

    【讨论】:

    • 感谢您的快速响应。只是为了进一步调查 - 当 SAF 授予我对 URI 的访问权限并且该特定 URI 表示本地文件时,这并没有授予我直接使用该文件路径的能力,我仍然必须通过 ContentResolver,对吗? (因为否则我可以在文件路径中使用RandomAccessFile
    • @MartinZikmund:“这不授予我直接使用该文件路径的能力”——您不知道文件路径是什么。例如,让我们回到我的回答中的“将其内容存储在本地,但由流密码加密的提供商”。此提供程序将内容作为文件存储在该应用程序的getFilesDir() 中的文件系统上。 Uri 不必识别该文件的路径。即使您使用一些脚本小子算法对路径进行逆向工程,您也没有文件系统权限,并且内容是加密的。
    • @MartinZikmund:我很乐意同意 SAF 不是一个很好的 API,而且我之前遇到过这种特定的问题(用于媒体播放)。不幸的是,“就是这样”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2016-09-06
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    相关资源
    最近更新 更多