Dopo Android 4.4 Kitkat, e dal 2017 la quota di Android 4.4 e meno è di circa il 20% e in diminuzione, non è possibile salvare su scheda SD utilizzando la File
classe e il getExternalStorageDirectory()
metodo. Questo metodo restituisce la memoria interna del dispositivo e salva le immagini visibili a tutte le app. Puoi anche salvare immagini solo private nella tua app e da eliminare quando l'utente elimina la tua app con il openFileOutput()
metodo.
A partire da Android 6.0, è possibile formattare la scheda SD come memoria interna ma solo privata sul dispositivo (se si formatta l'automobile SD come memoria interna, solo il dispositivo può accedere o visualizzarne il contenuto) È possibile salvare su quella scheda SD utilizzando altre risposte ma se si desidera utilizzare una scheda SD rimovibile, leggere la mia risposta di seguito.
È necessario utilizzare Storage Access Framework per ottenere il onActivityResult
metodo di attività uri in cartella per ottenere la cartella selezionata dall'utente e aggiungere l'autorizzazione persistente per recuperare per poter accedere alla cartella dopo che l'utente ha riavviato il dispositivo.
@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);
}
}
}
}
Ora, salva la cartella di salvataggio nelle preferenze condivise per non chiedere all'utente di selezionare la cartella ogni volta che vuoi salvare un'immagine.
Dovresti usare la DocumentFile
classe per salvare l'immagine, no File
oppure ParcelFileDescriptor
, per maggiori informazioni puoi controllare questo thread per salvare l'immagine sulla scheda SD con compress(CompressFormat.JPEG, 100, out);
metodo e DocumentFile
classi.
mImage.setImageBitmap(_result.getBitmap());
mioonTaskComplete()
callback. Ora devo consentire agli utenti di salvare il file localmente se lo desiderano tramite il menu di scelta rapida a lungo. Dovrei essere in grado di utilizzare la soluzione di seguito. Quello che voglio sapere, però, hai scoperto un approccio migliore a questo?