Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
641 views
in Technique[技术] by (71.8m points)

mediastore - Writing files to publicly accessible documents folder in Android Q - Scoped Storage

Background

After migrating to Android Q I can no longer find a suitable way to gain write access to the documents folder (/storage/emulated/0/Documents)

And before anyone mentions the many other questions on scoped storage I've read through many of them and from what I've seen so far all of the solutions use a app specific directory or accessing a media directory only (not documents folder access).

From what I understand in Android Q I can either choose:

  • Use a app specific directory that is only accessible by my app (or apps I give permission to)
  • Allow the user to select where they want the file stored (I think this can be a public location) ACTION_OPEN_DOCUMENT_TREE

Problem

The applications I develop are used to conduct tests on subjects, the data from the tests automatically gets stored in the publicly accessible Documents folder somewhat like: /storage/emulated/0/Documents/myAppName/subjectName/testData-todaysDate.pdf

When the user wants to access the test data they plug their smartphone into a computer and navigate to the documents folder and the rest is pretty obvious. For this reason I have to use publicly accessible storage. Also imagine they want to open the test data on their phone via another app, Same deal!

The solution I'm looking for

So the solution I'm looking for needs to be able to do the following:

  • Doesn't ask for permission multiple times (once is ok)
  • Automatically saves test data without user prompt (as hundreds of tests will be conducted)
  • Saves to public documents folder e.g. /storage/emulated/0/Documents/
  • Doesn't involve the user selecting the directory so NOT ACTION_OPEN_DOCUMENT_TREE
  • Ideally the data is persistent so uninstalling the app doesn't cause data lose

I get that these changes in Android Q are to bring users more "into the loop" with how apps are accessing their data but once they understand how your app is using your data there shouldn't be a problem.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

For Android Q only.

String collection = "content://media/1c11-2404/file"; // One can even write to micro SD card
String relative_path = "Documents/MyFolder";

Uri collectionUri = Uri.parse(collection);

ContentValues contentValues = new ContentValues();

contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, displayName);
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, mimeType);
contentValues.put(MediaStore.MediaColumns.SIZE, filesize);
contentValues.put(MediaStore.MediaColumns.DATE_MODIFIED, modified );
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, relative_path);
contentValues.put(MediaStore.MediaColumns.IS_PENDING, 1)

Uri fileUri = context.getContentResolver().insert(collectionUri, contentValues);

Having an uri one can open an output stream to write the content for the file.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...