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

时间:2016-01-14 13:01:16

标签: java android storage-access-framework

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

看起来Uri是云的关键,而不是本地文件。

Uri值看起来像这样:

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

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

2 个答案:

答案 0 :(得分:3)

  

看起来Uri是云的关键,而不是本地文件。

Uri是对一段内容的不透明引用。您无法知道数据的位置,也不关心。

  

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

理想情况下,你没有。理想情况下,您使用支持InputStream的某个库“扫描文件(照片或文档)”。在这种情况下,您可以使用ContentResolveropenInputStream()来将流传递到库中。

如果您的库不支持InputStream作为数据源,您将需要自己使用openInputStream(),使用Java I / O将内容的副本复制为文件系统中的文件,你可以把它传给图书馆。

答案 1 :(得分:0)

在以下情况下,您可以通过随机访问直接从基础文件读取:

  • 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存储在某个地方:如果该对象被垃圾回收,该通道将不再能够访问该文件。