Nach Android 4.4 Kitkat, und 2017 liegt der Anteil von Android 4.4 und weniger bei etwa 20 % und nimmt weiter ab, ist es nicht mehr möglich, auf der SD-Karte zu speichern. File
Klasse und getExternalStorageDirectory()
Methode. Diese Methode gibt den internen Speicher Ihres Geräts zurück und speichert Bilder, die für jede App sichtbar sind. Sie können auch Bilder speichern, die nur für Ihre App bestimmt sind und gelöscht werden, wenn der Benutzer Ihre App mit openFileOutput()
Methode.
Ab Android 6.0 können Sie Ihre SD-Karte als internen Speicher formatieren, aber nur für Ihr Gerät. (Wenn Sie die SD-Karte als internen Speicher formatieren, kann nur Ihr Gerät auf den Inhalt zugreifen oder ihn sehen). Sie können auf dieser SD-Karte mit anderen Antworten speichern, aber wenn Sie eine austauschbare SD-Karte verwenden möchten, sollten Sie meine Antwort unten lesen.
Sie sollten Folgendes verwenden Rahmen für den Speicherzugang um uri zum Ordner zu erhalten onActivityResult
Methode der Aktivität, um den vom Benutzer ausgewählten Ordner zu erhalten, und fügen Sie eine dauerhafte Berechtigung hinzu, damit der Benutzer nach einem Neustart des Geräts auf den Ordner zugreifen kann.
@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 jetzt den Ordner in den gemeinsamen Einstellungen, damit der Benutzer nicht jedes Mal einen Ordner auswählen muss, wenn Sie ein Bild speichern wollen.
Sie sollten Folgendes verwenden DocumentFile
Klasse, um Ihr Bild zu speichern, nicht File
o ParcelFileDescriptor
Für weitere Informationen können Sie unter dieses Thema zum Speichern von Bildern auf SD-Karte mit compress(CompressFormat.JPEG, 100, out);
Methode und DocumentFile
classes.