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
的库。在这种情况下,您可以使用 ContentResolver
和 openInputStream()
将流传递给库。
如果您的图书馆不支持 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 存储在某处:如果该对象被垃圾收集,通道将不再能够访问该文件。
我正在我的应用程序中使用 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
的库。在这种情况下,您可以使用 ContentResolver
和 openInputStream()
将流传递给库。
如果您的图书馆不支持 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 存储在某处:如果该对象被垃圾收集,通道将不再能够访问该文件。