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:
- Cómo obtener googlemaps para aceptar un archivo KML local?
- Cómo obtener un objeto Uri desde Bitmap
- Error en la conexión http java.lang.IllegalArgumentException: El carácter no permitido en la consulta en el índice 76
- Abrir archivo html local con el navegador de Android
- Compartir imagen de la URL a través de la aplicación de Twitter - Android
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());
- Cómo obtener la ruta del archivo de la imagen de URI en Android Lollipop?
- Pantalla de chat de Skype desde la intención
- El atributo pathPrefix de Deeplink de Android se está omitiendo
- Descubriendo todo acerca de la clase Uri de Android: uso y propósito
- CursorLoader, obtiene URI para la base de datos local
- Android Uri to Filesize
- ¿El método notifyChange de ContentResolver notifica también el detalle de Uri?
- Widget de aplicación setImageViewUri no actualiza la imagen
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)
- Cómo implementar onBackPressed () en Fragmentos?
- Cómo establecer una fuente personalizada en el título de ActionBar?