Después de Android 4.4 Kitkat, y a partir de 2017, la cuota de Android 4.4 y menos es aproximadamente del 20% y disminuye, no es posible guardar en la tarjeta SD usando la File
clase y el getExternalStorageDirectory()
método. Este método devuelve la memoria interna de su dispositivo y las imágenes guardadas visibles para cada aplicación. También puede guardar imágenes privadas en su aplicación y eliminarlas cuando el usuario elimina su aplicación conopenFileOutput()
método.
A partir de Android 6.0, puede formatear su tarjeta SD como memoria interna pero solo privada para su dispositivo. (Si formatea el auto SD como memoria interna, solo su dispositivo puede acceder o ver su contenido) Puede guardar en esa tarjeta SD usando otras respuestas, pero si desea utilizar una tarjeta SD extraíble, debe leer mi respuesta a continuación.
Debería usar Storage Access Framework para obtener el onActivityResult
método de actividad de uri a carpeta para obtener la carpeta seleccionada por el usuario, y agregar permiso persistente recuperable para poder acceder a la carpeta después de que el usuario reinicie el 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);
}
}
}
}
Ahora, guarde la carpeta de guardar en las preferencias compartidas para no pedirle al usuario que seleccione la carpeta cada vez que desee guardar una imagen.
Debe usar DocumentFile
class para guardar su imagen, no File
o ParcelFileDescriptor
, para obtener más información, puede consultar este hilo para guardar la imagen en la tarjeta SD con el compress(CompressFormat.JPEG, 100, out);
método y las DocumentFile
clases.
mImage.setImageBitmap(_result.getBitmap());
de mionTaskComplete()
devolución de llamada. Ahora tengo que permitir que los usuarios guarden el archivo localmente si lo desean a través del menú contextual de pulsación larga. Debería poder usar la solución a continuación. Sin embargo, lo que quiero saber, ¿descubriste un mejor enfoque para esto?