Setelah Android 4.4 Kitkat, dan pada tahun 2017 pangsa Android 4.4 dan kurang adalah sekitar 20% dan menurun, tidak mungkin untuk menyimpan ke kartu SD menggunakan File
kelas dan getExternalStorageDirectory()
metode. Metode ini mengembalikan memori internal perangkat Anda dan gambar disimpan terlihat oleh setiap aplikasi. Anda juga dapat menyimpan gambar hanya pribadi untuk aplikasi Anda dan dihapus ketika pengguna menghapus aplikasi Anda dengan openFileOutput()
metode.
Dimulai dengan Android 6.0, Anda dapat memformat kartu SD Anda sebagai memori internal tetapi hanya pribadi untuk perangkat Anda. (Jika Anda memformat mobil SD sebagai memori internal, hanya perangkat Anda yang dapat mengakses atau melihat isinya) Anda dapat menyimpan ke kartu SD itu menggunakan jawaban lain tetapi jika Anda ingin menggunakan kartu SD yang dapat dilepas Anda harus membaca jawaban saya di bawah ini.
Anda harus menggunakan Kerangka Akses Penyimpanan untuk mendapatkan onActivityResult
metode aktivitas folder ke uri untuk mendapatkan folder yang dipilih oleh pengguna, dan menambahkan izin tetap yang retreive untuk dapat mengakses folder setelah pengguna memulai ulang perangkat.
@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);
}
}
}
}
Sekarang, simpan simpan folder ke preferensi bersama untuk tidak meminta pengguna memilih folder setiap kali Anda ingin menyimpan gambar.
Anda harus menggunakan DocumentFile
kelas untuk menyimpan gambar Anda, bukan File
atau ParcelFileDescriptor
, untuk info lebih lanjut Anda dapat memeriksa utas ini untuk menyimpan gambar ke kartu SD dengan compress(CompressFormat.JPEG, 100, out);
metode dan DocumentFile
kelas.
mImage.setImageBitmap(_result.getBitmap());
dionTaskComplete()
callback saya . Saya sekarang harus mengizinkan pengguna untuk menyimpan file secara lokal jika mereka mau melalui menu konteks pers yang panjang. Saya harus dapat menggunakan solusi di bawah ini. Apa yang ingin saya ketahui, apakah Anda menemukan pendekatan yang lebih baik untuk ini?