¿Cuál es la forma más fácil de convertir de file:
android.net.Uri
a aFile
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());
Respuestas:
Lo que quieres es ...
... y no...
NOTA:
uri.toString()
devuelve una cadena en el formato:"file:///mnt/sdcard/myPicture.jpg"
, mientras queuri.getPath()
devuelve una cadena en el formato:"/mnt/sdcard/myPicture.jpg"
.fuente
toString
hacer?url.toString()
devolver una Cadena en el siguiente formato: "archivo: ///mnt/sdcard/myPicture.jpg", mientras queurl.getPath()
devuelve una Cadena en el siguiente formato: "/mnt/sdcard/myPicture.jpg", es decir, sin el tipo de esquema pre fijo.open failed: ENOENT (No such file or directory)
cuando intento abrir el archivo dado con esto. Además, si el Uri es el Uri de contenido de una imagen, por ejemplo, definitivamente no funciona.Después de buscar durante mucho tiempo, esto es lo que funcionó para mí:
fuente
managedQuery
ahora está en desuso. usegetContentResolver().query(...)
en su lugar, que funciona en API 11+. Agregue un condicional para dispositivos anteriores a API 11.utilizar
directamente y copie el archivo. Ver también:
https://developer.android.com/guide/topics/providers/document-provider.html
fuente
EDITAR: Lo siento, debería haber probado mejor antes. Esto debería funcionar:
URI es java.net.URI.
fuente
androidURI
es un android.net.Uri. java.net.URI (que existe en Android) solo se usa como parte del proceso de conversión.java.lang.IllegalArgumentException: Expected file scheme in URI: content://com.shajeel.daily_monitoring.localstorage.documents.localstorage.documents/document/%2Fstorage%2Femulated%2F0%2FBook1.xlsx
excepción después de usar este método.Mejor solución
Cree una clase FileUtil simple y úsela para crear, copiar y renombrar el archivo
Soy útil
uri.toString()
yuri.getPath()
no trabajo para mí. Finalmente encontré esta solución.Use la clase FileUtil en su código
fuente
Nada de esto funciona para mí. Encontré que esta es la solución de trabajo. Pero mi caso es específico de las imágenes .
fuente
Android + Kotlin
Agregar dependencia para las extensiones de Android Kotlin:
implementation 'androidx.core:core-ktx:{latestVersion}'
Obtener archivo de uri:
uri.toFile()
Android + Java
Solo muévete hacia arriba;)
fuente
file
Con Kotlin es aún más fácil:
O si está utilizando extensiones de Kotlin para Android :
fuente
@CommonsWare explicó todas las cosas bastante bien. Y realmente deberíamos usar la solución que él propuso.
Por cierto, solo la información en la que podemos confiar cuando hacemos consultas
ContentResolver
es el nombre y el tamaño de un archivo como se menciona aquí: Recuperando información de archivo | Desarrolladores de AndroidComo puedes ver hay una interfaz
OpenableColumns
que contiene solo dos campos: DISPLAY_NAME y SIZE.En mi caso, necesitaba recuperar información EXIF sobre una imagen JPEG y rotarla si fuera necesario antes de enviarla a un servidor. Para hacer eso, copié el contenido de un archivo en un archivo temporal usando
ContentResolver
yopenInputStream()
fuente
Hice esto de la siguiente manera:
Básicamente, primero trato de usar un archivo, es decir, una imagen tomada por la cámara y guardada en la tarjeta SD. Esto no funciona para la imagen devuelta por: Intent photoPickerIntent = new Intent (Intent.ACTION_PICK); En ese caso, es necesario convertir Uri en ruta real por
getRealPathFromURI()
función. Entonces, la conclusión es que depende del tipo de Uri que desee convertir a archivo.fuente
Si tiene uno
Uri
que se ajusta alDocumentContract
, probablemente no quiera usarloFile
. Si está en kotlin, useDocumentFile
para hacer cosas que usaría en el Viejo MundoFile
y useContentResolver
para obtener transmisiones.Todo lo demás está prácticamente garantizado para romperse.
fuente
Para este caso, especialmente en Android, el camino para los bytes suele ser más rápido.
Con esto, lo resolví estableciendo una clase
FileHelper
que tiene la responsabilidad de ocuparse de leer / escribir bytes desde / a un archivo a través de una secuencia y una claseUriHelper
que tiene la responsabilidad de averiguar la ruta de Uri y el permiso.Por lo que se sabe en general,
string.getBytes((charset == null) ? DEFAULT_CHARSET:charset)
puede ayudarnos a transferir la cadena que desea a los bytes que necesita.Cómo permitir que UriHelper y FileHelper le copien una imagen anotada por Uri en un archivo, puede ejecutar:
acerca de mi UriHelper:
}
acerca de mi FileHelper:
}
fuente
Para las personas que están buscando una solución para imágenes en particular, aquí está.
fuente
Archivo imageToUpload = nuevo archivo (nuevo URI (androidURI.toString ())); funciona si este es un archivo que ha creado en el almacenamiento externo.
Por ejemplo, archivo: /// storage / emulated / 0 / (algún directorio y nombre de archivo)
fuente
public String getRealPathFromURI (Uri uri) {
Luego, para obtener el archivo de URI:
- LA ESPERANZA PUEDE AYUDARTE ----
fuente
Mediante el siguiente código, puedo obtener el archivo pdf compartido de la aplicación de Adobe como flujo y guardarlo en la ruta de la aplicación de Android
fuente
Base de extensión en @Jacek Kwiecień respuesta para convertir uri de imagen a archivo
Si usamos
File(uri.getPath())
, no funcionaráSi usamos la extensión de android-ktx , todavía no funciona porque https://github.com/android/android-ktx/blob/master/src/main/java/androidx/core/net/Uri.kt
fuente
DATA
columna (y ese era un enfoque poco confiable en primer lugar).Agregar
onActivityResult
, obtener docx o archivo pdffuente