In meiner Anwendung kann Benutzer das Download-Verzeichnis auswählen. Wenn er wählt externe entfernbare SD-Karte (keine emulierte SD-Karte !, aber ein Speicher, der zum Beispiel eine echte microSD-Karte ist), ab Android 4.4 kann ich nur schreiben mit SAF
(Storage Access Framework).Storage Access Framework, takePersistableUriPermission
Ich habe herausgefunden, wie eine einzelne Datei mit SAF erstellen und schreiben:
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);
}
Und hier ist mein onActivityResult, wo ich Datei tatsächlich schreiben Sie an:
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);
}
}
}
}
Und auch 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();
}
}
Und schließlich meine Frage:
Wie erstelle ich andere Dateien und schreibe sie, nachdem ich getContentResolver().takePersistableUriPermission
ohne eine Aufforderung zur Auswahl eines Verzeichnisses in Zukunft angerufen habe?
Wenn ich Recht habe, dann getContentResolver().takePersistableUriPermission
shoudl erlauben Sie mir tha