Convertir archivo: Uri a archivo en Android
¿Cuál es la forma más sencilla de convertir desde un objeto android.net.Uri que contiene un file:
tipo a un objeto java.io.File en Android?
Intenté lo siguiente pero no funciona:
File file = new File(Environment.getExternalStorageDirectory(), "read.me");
Uri uri = Uri.fromFile(file);
File auxFile = new File(uri.toString());
assertEquals(file.getAbsolutePath(), auxFile.getAbsolutePath());
Aceptado
Lo que quieres es...
new File(uri.getPath());
... y no...
new File(uri.toString());
Notas
- Para un
android.net.Uri
objeto cuyo nombreuri
y creación son exactamente como en la pregunta ,uri.toString()
devuelve aString
en el formato"file:///mnt/sdcard/myPicture.jpg"
, mientras queuri.getPath()
devuelve aString
en el formato"/mnt/sdcard/myPicture.jpg"
. - Entiendo que existen matices en el almacenamiento de archivos en Android. Mi intención en esta respuesta es responder exactamente lo que preguntó el interlocutor y no entrar en matices.
usar
InputStream inputStream = getContentResolver().openInputStream(uri);
directamente y copie el archivo. Ver también:
https://developer.android.com/guide/topics/providers/document-provider.html
Después de buscar durante mucho tiempo esto es lo que funcionó para mí:
File file = new File(getPath(uri));
public String getPath(Uri uri)
{
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
if (cursor == null) return null;
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String s=cursor.getString(column_index);
cursor.close();
return s;
}
Android + Kotlin
Agregue dependencia para las extensiones de Kotlin para Android:
implementation 'androidx.core:core-ktx:{latestVersion}'
Obtener archivo de uri:
uri.toFile()