Après Android 4.4 Kitkat, et à partir de 2017, la part d'Android 4.4 et moins est d'environ 20% et diminue, il n'est pas possible d'enregistrer sur la carte SD en utilisant la File
classe et la getExternalStorageDirectory()
méthode. Cette méthode renvoie la mémoire interne de votre appareil et les images enregistrées visibles à chaque application. Vous pouvez également enregistrer des images uniquement privées pour votre application et à supprimer lorsque l'utilisateur supprime votre application avec la openFileOutput()
méthode.
À partir d'Android 6.0, vous pouvez formater votre carte SD en tant que mémoire interne mais uniquement privée sur votre appareil. (Si vous formatez la voiture SD en mémoire interne, seul votre appareil peut accéder ou voir son contenu) Vous pouvez enregistrer sur cette carte SD en utilisant d'autres réponses mais si vous souhaitez utiliser une carte SD amovible, vous devriez lire ma réponse ci-dessous.
Vous devez utiliser Storage Access Framework pour obtenir la onActivityResult
méthode d'activité uri to folder pour obtenir le dossier sélectionné par l'utilisateur, et ajouter une autorisation persistible de récupération pour pouvoir accéder au dossier après que l'utilisateur a redémarré l'appareil.
@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);
}
}
}
}
Maintenant, enregistrez le dossier d'enregistrement dans les préférences partagées pour ne pas demander à l'utilisateur de sélectionner le dossier chaque fois que vous souhaitez enregistrer une image.
Vous devez utiliser la DocumentFile
classe pour enregistrer votre image, pas File
ou ParcelFileDescriptor
, pour plus d'informations, vous pouvez vérifier ce fil pour enregistrer l'image sur la carte SD avec la compress(CompressFormat.JPEG, 100, out);
méthode et les DocumentFile
classes.
mImage.setImageBitmap(_result.getBitmap());
dans mononTaskComplete()
rappel. Je dois maintenant autoriser les utilisateurs à enregistrer le fichier localement s'ils le souhaitent via le menu contextuel de la presse longue. Je devrais pouvoir utiliser la solution ci-dessous. Ce que je veux savoir cependant, avez-vous découvert une meilleure approche à ce sujet?