Tengo un onActivityResult
retorno de una selección de imágenes de mediastore que puedo obtener un URI para una imagen usando lo siguiente:
Uri selectedImage = data.getData();
Convertir esto en una cadena da esto:
content://media/external/images/media/47
O a un camino da:
/external/images/media/47
Sin embargo, parece que no puedo encontrar una manera de convertir esto en una ruta absoluta, ya que quiero cargar la imagen en un mapa de bits sin tener que copiarla en alguna parte. Sé que esto se puede hacer usando el URI y el solucionador de contenido, pero parece que esto no funciona al reiniciar el teléfono, supongo MediaStore
que no mantiene su numeración igual entre los reinicios.
android
uri
absolute-path
mediastore
Stealthcopter
fuente
fuente
Respuestas:
Debajo de la API 19, use este código para obtener la Ruta del archivo desde el URI:
fuente
Solo una simple actualización de la primera respuesta:
mActivity.managedQuery()
ahora está en desuso. He actualizado el código con el nuevo método.fuente de desarrollo de Android
fuente
content://...
. Intenté todas las sugerencias aquí sin suerte. ¿Alguna idea de por qué?Para Oreo
Para todas las versiones debajo de Oreo, he hecho este método que obtiene una ruta real desde uri
fuente
No intentes encontrar una uri en el sistema de archivos, es lento para buscar cosas en la base de datos.
Puede obtener un mapa de bits de una uri dando un flujo de entrada a la fábrica como si le entregara un archivo a la fábrica:
fuente
Aquí está mi ejemplo de cómo obtener el nombre del archivo, de URI como file: // ... y content: // .... Me funciona no solo con Android MediaStore sino también con aplicaciones de terceros como EzExplorer.
fuente
Buenas respuestas existentes, algunas de las cuales solía tener las mías:
Tengo que obtener la ruta de los URI y obtener el URI de las rutas, y Google tiene dificultades para distinguir la diferencia, por lo que para cualquier persona que tenga el mismo problema (por ejemplo, para obtener la miniatura
MediaStore
de un video cuya ubicación física ya tiene ) El primero:El último (que hago para videos, pero también se puede usar para Audio o Archivos u otros tipos de contenido almacenado al sustituir MediaStore.Audio (etc.) por MediaStore.Video):
Básicamente, la
DATA
columna deMediaStore
(o la subsección que esté consultando) almacena la ruta del archivo, por lo que puede usar lo que sabe para buscar eseDATA
campo o usar el campo para buscar lo que quiera.Luego utilizo lo
Scheme
anterior para descubrir qué hacer con mis datos:fuente
Ninguna de estas respuestas me funcionó en todos los casos. Tuve que ir directamente a la documentación de Google https://developer.android.com/guide/topics/providers/document-provider.html sobre este tema y encontré este método útil:
Puede usar este mapa de bits para mostrarlo en una Vista de imagen.
fuente
API 19 y superior , la ruta del archivo de imagen de Uri funciona perfectamente. También reviso esta última PIE API 28 .
fuente
CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
en esta línea:path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
intente esto obtener la ruta del archivo de imagen de Uri
fuente
Solución para aquellos que tienen problemas después de mudarse a KitKat:
"Esto obtendrá la ruta del archivo de MediaProvider, DownloadsProvider y ExternalStorageProvider, mientras recurre al método no oficial ContentProvider" https://stackoverflow.com/a/20559175/690777
fuente
Después de obtener una imagen de la galería, simplemente pase el URI en el siguiente método solo para Android 4.4 (KitKat):
fuente
Prueba esto
Aún así, si tiene el problema para obtener el camino real, puede probar mis respuestas. Las respuestas anteriores no me ayudaron.
Explicación : - Este método obtiene el URI y luego verifica el nivel de API de su dispositivo Android después de eso, de acuerdo con el nivel de API, generará la ruta Real. El código para generar el método de ruta real es diferente según los niveles de API.
método para obtener la ruta Real desde URI
Usa este método así
Salida:-
fuente
String wholeID = DocumentsContract.getDocumentId(uri);
que obtengo:java.lang.RuntimeException: Failure delivering result
He hecho así:
fuente
Dado que managedQuery ha quedado en desuso, puede intentar:
fuente
Aquí voy a mostrarle cómo crear un botón NAVEGAR, que cuando haga clic, abrirá la tarjeta SD, seleccionará un Archivo y, como resultado, obtendrá el nombre y la ruta del archivo seleccionado uno:
Un botón que golpearás
La función que obtendrá el nombre del archivo resultante y la ruta del archivo
fuente
content://com.fsck.k9.attachmentprovider/34fc2cc9-aa46-45e9-9e3f-2f27f0457249/1/VIEW
. Después de aplicar los métodos aquí, sigo obteniendo la misma cadena, no la ruta correcta, es decir/mnt/sdcard/Android/data/com.fsck.k9/files/34fc2cc9-aa46-45e9-9e3f-2f27f0457249.db_att/1
. ¿Alguna pista?¿De alguna manera para Android Q anterior , cuando MediaStore.Images.Media.DATA ya no estará disponible? Este campo se deprecia en Android Q:
https://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html#DATA
--- Editado
Por lo que sé para el pasado Android Q, la única forma es retransmitir en RELATIVE_PATH
https://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html#RELATIVE_PATH
fuente
Versión ligeramente modificada de @PercyPercy: no se lanza y solo devuelve nulo si algo sale mal :
fuente
Aquí obtienes el nombre del archivo
fuente
Simple y fácil. ¡Puedes hacer esto desde el URI como se muestra a continuación!
fuente
Esta solución funciona para cada caso:
Es demasiado difícil en algunos casos obtener la ruta desde la URL. Entonces, ¿por qué necesitas el camino? Para copiar el archivo en otro lugar? No necesitas el camino.
fuente
Perfectamente trabajando para mí código fijo de esta publicación :
fuente
Como complemento, si necesita ver si existe un archivo antes de intentar abrir una secuencia de entrada, puede usar DocumentsContract.
(Código de Kotlin)
fuente
Como las respuestas anteriores no funcionaron para mí, aquí está la solución que funcionó para mí:
Para ambos> 19 y <= 19 niveles de API.
Este método cubre todos los casos para obtener filePath desde uri
fuente
Para obtener cualquier tipo de ruta de archivo, use esto:
fuente
Compruebe a continuación el método está funcionando increíble también Oreo 8.1 ..
Clase de ruta URI:
fuente
Hago esto con un trazador de líneas:
val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri)
Que en el onActivityResult se ve así:
fuente
Las cosas se complican ahora, especialmente después del nivel de API 29 Android Q. Así es como debe obtener el nombre de archivo del contenido Uri
y así es como obtienes la ruta completa de Content Uri para todas las versiones de Android
fuente
Esto funciona perfectamente para mí si la versión de su sistema es superior a 19, espero que esto pueda ayudarlo.
fuente
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
fuente