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 转换为本地文件?我应该从云端下载文件吗?我该怎么做?

As it seems the Uri is a key for the cloud and not a local file.

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

How can i convert this Uri into a local file?

理想情况下,您不需要。理想情况下,您 "scan a file(photo or document)" 使用一些支持 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 存储在某处:如果该对象被垃圾收集,通道将不再能够访问该文件。