Convertir archivo: Uri a archivo en Android

Resuelto hpique asked hace 54 años • 29 respuestas

¿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());
hpique avatar Jan 01 '70 08:01 hpique
Aceptado

Lo que quieres es...

new File(uri.getPath());

... y no...

new File(uri.toString());
Notas
  1. Para un android.net.Uriobjeto cuyo nombre uriy creación son exactamente como en la pregunta , uri.toString()devuelve a Stringen el formato "file:///mnt/sdcard/myPicture.jpg", mientras que uri.getPath()devuelve a Stringen el formato "/mnt/sdcard/myPicture.jpg".
  2. 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.
Adil Hussain avatar Dec 03 '2011 19:12 Adil Hussain

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;
    }
Sanket Berde avatar May 12 '2013 19:05 Sanket Berde

Android + Kotlin

  1. Agregue dependencia para las extensiones de Kotlin para Android:

    implementation 'androidx.core:core-ktx:{latestVersion}'

  2. Obtener archivo de uri:

    uri.toFile()

Hemant Kaushik avatar May 25 '2018 06:05 Hemant Kaushik