Convertir archivo: Uri a archivo en Android

¿Cuál es la forma más fácil de convertir desde un file: android.net.Uri a un File en Android?

Intentó lo siguiente, pero no funciona:

  final File file = new File(Environment.getExternalStorageDirectory(), "read.me"); Uri uri = Uri.fromFile(file); File auxFile = new File(uri.toString()); assertEquals(file.getAbsolutePath(), auxFile.getAbsolutePath()); 

Lo que quieres es …

 new File(uri.getPath()); 

… y no…

 new File(uri.toString()); 

NOTA: url.toString() devuelve una cadena en el formato "file:///mnt/sdcard/myPicture.jpg" , mientras que url.getPath() devuelve una cadena en el formato: "/mnt/sdcard/myPicture.jpg"

No hay manera "fácil" de hacer esto. Un Uri no es un File . Un Uri no tiene que representar un archivo en el sistema de archivos al que pueda acceder. El Uri podría apuntar al contenido que es:

  • Almacenado en un almacenamiento extraíble, al que no puede acceder
  • Almacenado en el almacenamiento interno de otra aplicación, a la que no puede acceder
  • Almacenado en una forma encriptada, donde un ContentProvider necesita descifrarlo
  • Almacenado en una columna BLOB de una base de datos SQLite, donde un ContentProvider necesita cargarlo y servirlo
  • Almacenado en "la nube", donde un ContentProvider necesita descargarlo
  • Generado sobre la marcha, la forma en que esta página web es
  • y así

Puede utilizar ContentResolver y openInputStream() para obtener un InputStream en el contenido representado por el Uri . Puede crear un FileOutputStream en algún archivo que controle. Y, puede utilizar Java I / O para copiar desde InputStream a OutputStream , haciendo su propia copia del contenido en un archivo que usted controla.

EDIT: Lo siento, debería haber probado mejor antes. Esto debería funcionar:

 new File(new URI(androidURI.toString())); 

URI es java.net.URI.

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; } 

utilizar

 InputStream inputStream = getContentResolver().openInputStream(uri); 

Directamente y copiar el archivo. Ver también:

https://developer.android.com/guide/topics/providers/document-provider.html

Nada de esto funciona para mí. He encontrado que esta es la solución de trabajo:

 String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = getActivity().getContentResolver().query(uri, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String filePath = cursor.getString(columnIndex); cursor.close(); 

Hice esto de la siguiente manera:

 try { readImageInformation(new File(contentUri.getPath())); } catch (IOException e) { readImageInformation(new File(getRealPathFromURI(context, contentUri))); } public static String getRealPathFromURI(Context context, Uri contentUri) { String[] proj = { MediaStore.Images.Media.DATA }; Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null); int column_index = cursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } 

Así que, básicamente, primero intento utilizar un archivo, es decir, foto tomada por la cámara y guardado en la tarjeta SD. Esto no funciona para la imagen devuelta por: Intención photoPickerIntent = new Intent (Intent.ACTION_PICK); Ese caso hay una necesidad de convertir Uri a la ruta real por la función getRealPathFromURI() . Así que la conclusión es que depende de qué tipo de Uri que desea convertir a archivo.

@CommonsWare explicó todas las cosas bastante bien. Y realmente deberíamos usar la solución que propuso.

Por cierto, sólo la información en la que podríamos confiar al consultar ContentResolver es el nombre y el tamaño de un archivo como se menciona aquí: Recuperando información de archivos | Desarrolladores de Android

Como se puede ver, hay una interfaz OpenableColumns que contiene sólo dos campos: DISPLAY_NAME y SIZE.

En mi caso, era necesario recuperar la información EXIF ​​sobre una imagen JPEG y rotar si es necesario antes de enviar a un servidor. Para ello copié un contenido de archivo en un archivo temporal usando ContentResolver y openInputStream()

Para la gente que está aquí en busca de una solución para las imágenes en particular aquí es.

 private Bitmap getBitmapFromUri(Uri contentUri) { String path = null; String[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(contentUri, projection, null, null, null); if (cursor.moveToFirst()) { int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); path = cursor.getString(columnIndex); } cursor.close(); Bitmap bitmap = BitmapFactory.decodeFile(path); return bitmap; } 

Archivo imageToUpload = nuevo Archivo (nuevo URI (androidURI.toString ())); Funciona si se trata de un archivo u creado en el almacenamiento externo.

Por ejemplo file: /// storage / emulated / 0 / (algunos directorio y nombre de archivo)

  • Android Wear elimina datos de DataApi con deleteDataItems
  • Problemas de Uri
  • Android GCM PushNotification - Añadir añadir archivo de sonido personalizado en la aplicación
  • Android: vinculación de aplicaciones - sólo admite ciertos caminos?
  • Cómo utilizar ExifInterface con una secuencia o un URI
  • Obtener la lista de contactos y el estado de skype en android
  • Uri a la notificación de sonido por defecto?
  • Cómo obtener la ruta completa del archivo desde URI
  • Crear archivo de tipo android de Uri
  • Content: // mms-sms / conversations / return NullPointerException en Android ICS Samsung
  • Uri regresó después de ACTION_GET_CONTENT de la galería no está trabajando en setImageURI () de ImageView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.