Reputation: 3049
I am using Storage Access Framework(SAF)
in my app. In order to scan a file(photo or document) i need send a local file path trough an API. I've managed to setup the SAF
correctly, and now when a user chooses a file and i am getting a Uri as it supposed to be.
As it seems the Uri is a key for the cloud and not a local file.
The Uri value looks like that:
content://com.android.providers.media.documents/document/image:11862
How can i convert this Uri into a local file? Should i download the file from the cloud? How can i do it?
Upvotes: 4
Views: 3800
Reputation: 530
You can read directly from the underlying file, with random access, under the following conditions:
com.android.externalstorage.documents
;ParcelFileDescriptor parcelFileDescriptor = getContext().getContentResolver().openFileDescriptor(documentUri, "rw");
FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
FileChannel channel = new FileInputStream(fileDescriptor).getChannel();
Store the FileDescriptor somewhere as long as you keep the FileChannel open: if that object gets garbage collected the channel will be no longer able to access the file.
Upvotes: 1
Reputation: 1006594
As it seems the Uri is a key for the cloud and not a local file.
The Uri
is an opaque reference to a piece of content. You have no way of knowing where the data is, nor should you care.
How can i convert this Uri into a local file?
Ideally, you don't. Ideally, you "scan a file(photo or document)" using some library that supports an InputStream
. In that case, you use ContentResolver
and openInputStream()
to get the stream to pass to the library.
If your library does not support InputStream
as a data source, you will need to use openInputStream()
yourself, using Java I/O to make a copy of the content as a file in the filesystem, for you to pass to the library.
Upvotes: 5