Nach Android 4.4 Kitkat und ab 2017 beträgt der Anteil von Android 4.4 und weniger etwa 20% und nimmt ab. Es ist nicht möglich, mit File
Klasse und getExternalStorageDirectory()
Methode auf einer SD-Karte zu speichern . Diese Methode gibt den internen Speicher Ihres Geräts zurück und speichert Bilder, die für jede App sichtbar sind. Sie können Bilder auch nur privat in Ihrer App speichern und löschen, wenn der Benutzer Ihre App mit der openFileOutput()
Methode löscht .
Ab Android 6.0 können Sie Ihre SD-Karte als internen Speicher formatieren, jedoch nur privat für Ihr Gerät. (Wenn Sie das SD-Auto als internen Speicher formatieren, kann nur Ihr Gerät auf dessen Inhalt zugreifen oder diesen anzeigen.) Sie können mit auf dieser SD-Karte speichern andere Antworten, aber wenn Sie eine austauschbare SD-Karte verwenden möchten, sollten Sie meine Antwort unten lesen.
Sie sollten Storage Access Framework verwenden , um die onActivityResult
Aktivitätsmethode uri to folder abzurufen, um den Ordner vom Benutzer auswählen zu lassen, und eine dauerhafte Berechtigung zum Abrufen hinzufügen, um nach dem Neustart des Geräts durch den Benutzer auf den Ordner zugreifen zu können.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
// selectDirectory() invoked
if (requestCode == REQUEST_FOLDER_ACCESS) {
if (data.getData() != null) {
Uri treeUri = data.getData();
tvSAF.setText("Dir: " + data.getData().toString());
currentFolder = treeUri.toString();
saveCurrentFolderToPrefs();
// grantUriPermission(getPackageName(), treeUri,
// Intent.FLAG_GRANT_READ_URI_PERMISSION |
// Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
final int takeFlags = data.getFlags()
& (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// Check for the freshest data.
getContentResolver().takePersistableUriPermission(treeUri, takeFlags);
}
}
}
}
Speichern Sie nun den Speicherordner in den freigegebenen Einstellungen, damit der Benutzer nicht jedes Mal, wenn Sie ein Bild speichern möchten, aufgefordert wird, einen Ordner auszuwählen.
Sie sollten DocumentFile
class verwenden, um Ihr Bild zu speichern, nicht, File
oder ParcelFileDescriptor
für weitere Informationen können Sie diesen Thread überprüfen, um das Bild mit compress(CompressFormat.JPEG, 100, out);
Methode und DocumentFile
Klassen auf einer SD-Karte zu speichern .
mImage.setImageBitmap(_result.getBitmap());
in meinemonTaskComplete()
Rückruf. Ich muss jetzt Benutzern erlauben, die Datei lokal zu speichern, wenn sie über ein Kontextmenü mit langem Drücken möchten. Ich sollte in der Lage sein, die folgende Lösung zu verwenden. Was ich aber wissen möchte, haben Sie einen besseren Ansatz dafür gefunden?