Developing for Android is like being a demonetized YouTuber
Android's Storage Access Framework is really underrated.  Just ask the user to choose a document (file or image or whatever) by firing an intent-- then Android's built-in file picker starts up and you don't have to deal with implementing any of that UI experience.  After the user picks the file, a content:// URI is returned back.<p><a href="https://developer.android.com/guide/topics/providers/document-provider" rel="nofollow">https://developer.android.com/guide/topics/providers/documen...</a><p>Best part-- along with the URI, you get the permission to access the document/file/image/audio/whatever "for free" without ever having to request it!  Because you kind of just did-- the act of the user picking the file auto-gives you the read permission, which can be kept ("persisted") across system/app restarts.<p>This file may not even be on the actual device.  It could be on some cloud service or a file server or something else you've never even heard of.  Android handles it all for you. An example of this is Google Drive.  If they've installed the Google Drive app and it's linked to their account, the Storage Access Framework will let the user pick stuff from there just as easily as their own external storage.<p>You can also use the picker to create/save a new file or even choose a whole (directory/folder) tree.<p>Reading from the content:// URI is a little different than from a file:// , and I know there are some situations where this won't cut it.  But starting in Q you'll be kind of limited in where those files can be accessed.<p>But in most situations involving External Storage, the SAF is really what you want to use anyway.<p>Watch this little-seen video:<p><a href="https://www.youtube.com/watch?v=C28pvd2plBA" rel="nofollow">https://www.youtube.com/watch?v=C28pvd2plBA</a>