繁体   English   中英

Android - 存储访问框架 - Uri 到本地文件

[英]Android - Storage Access Framework - Uri into local file

我在我的应用程序中使用Storage Access Framework(SAF) 为了扫描文件(照片或文档),我需要通过 API 发送本地文件路径。 我已经设法正确设置了SAF ,现在当用户选择一个文件时,我得到了一个 Uri,因为它应该是。

看起来 Uri 是云的密钥而不是本地文件。

Uri 值如下所示:

content://com.android.providers.media.documents/document/image:11862 

如何将此 Uri 转换为本地文件? 我应该从云端下载文件吗? 我该怎么做?

看起来 Uri 是云的密钥而不是本地文件。

Uri是对一段内容的不透明引用。 您无法知道数据在哪里,也不应该关心。

如何将此 Uri 转换为本地文件?

理想情况下,你不需要。 理想情况下,您使用支持InputStream的库“扫描文件(照片或文档)”。 在这种情况下,您可以使用ContentResolveropenInputStream()来获取要传递给库的流。

如果您的库不支持将InputStream作为数据源,您将需要自己使用openInputStream() ,使用 Java I/O 将内容作为文件复制到文件系统中,以便您传递给库。

在以下条件下,您可以通过随机访问直接从底层文件中读取:

  • URI 指向一个本地文件,你可以通过比较 URI 权限和值com.android.externalstorage.documents来检查;
  • 您对 URI 具有读写权限。
ParcelFileDescriptor parcelFileDescriptor = getContext().getContentResolver().openFileDescriptor(documentUri, "rw");
FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
FileChannel channel = new FileInputStream(fileDescriptor).getChannel();

只要您保持 FileChannel 打开,就将 FileDescriptor 存储在某处:如果该对象被垃圾收集,通道将不再能够访问该文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM