Vlad Matvienko Vlad Matvienko - 1 month ago 23
Android Question

Storage Access Framework, takePersistableUriPermission

In my application user is able to select the downloads directory. If he selects external removable SD card (not an emulated sd card!, but a memory, which is a real physicel microSD card for example), starting from Android 4.4 I am only able to write to it using

SAF
(Storage Access Framework).

I've figured out how to create and write a single file using SAF:

public void newFile() {
Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);

intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TITLE, "newfile.txt");

startActivityForResult(intent, CREATE_REQUEST_CODE);
}

public void saveFile() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("text/plain");

startActivityForResult(intent, SAVE_REQUEST_CODE);
}


And here is my onActivityResult, where I actually write to file:

public void onActivityResult(int requestCode, int resultCode,
Intent resultData) {
Uri currentUri = null;

if (resultCode == Activity.RESULT_OK) {
if (requestCode == CREATE_REQUEST_CODE) {
if (resultData != null) {
Log.d(TAG, "CREATE_REQUEST_CODE resultData = " + resultData);
}
} else if (requestCode == SAVE_REQUEST_CODE) {

if (resultData != null) {
currentUri = resultData.getData();
getContentResolver().takePersistableUriPermission(currentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
writeFileContent(currentUri);
Log.d(TAG, "SAVE_REQUEST_CODE currentUri = " + currentUri);
}
}
}
}


And also
writeFileContent
:

private void writeFileContent(Uri uri) {
try {
ParcelFileDescriptor pfd =
this.getContentResolver().
openFileDescriptor(uri, "w");

FileOutputStream fileOutputStream =
new FileOutputStream(pfd.getFileDescriptor());

String textContent = "some text";

fileOutputStream.write(textContent.getBytes());

fileOutputStream.close();
pfd.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}


And finally my question:

How do I create other files, and write them after I called
getContentResolver().takePersistableUriPermission
without a prompt to select a directory in future?

If I'm right, then
getContentResolver().takePersistableUriPermission
shoudl allow me to do tha

Answer

You can call ContentResolver.getPersistedUriPermissions() to get the persisted UriPermission list.

After that, you could just simply call getUri() on the UriPermission instances and use the returned Uri to write your content.