Estoy usando un administrador de archivos de terceros para elegir un archivo (PDF en mi caso) del sistema de archivos.
Así es como lanzo la actividad:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(getString(R.string.app_pdf_mime_type));
intent.addCategory(Intent.CATEGORY_OPENABLE);
String chooserName = getString(R.string.Browse);
Intent chooser = Intent.createChooser(intent, chooserName);
startActivityForResult(chooser, ActivityRequests.BROWSE);
Esto es lo que tengo en onActivityResult
:
Uri uri = data.getData();
if (uri != null) {
if (uri.toString().startsWith("file:")) {
fileName = uri.getPath();
} else { // uri.startsWith("content:")
Cursor c = getContentResolver().query(uri, null, null, null, null);
if (c != null && c.moveToFirst()) {
int id = c.getColumnIndex(Images.Media.DATA);
if (id != -1) {
fileName = c.getString(id);
}
}
}
}
El fragmento de código se toma prestado de las instrucciones de Open Intents File Manager disponibles aquí:
http://www.openintents.org/en/node/829
El propósito de if-else
es la compatibilidad con versiones anteriores. Me pregunto si esta es la mejor manera de obtener el nombre del archivo, ya que descubrí que otros administradores de archivos devuelven todo tipo de cosas.
Por ejemplo, Documents ToGo devuelve algo como lo siguiente:
content://com.dataviz.dxtg.documentprovider/document/file%3A%2F%2F%2Fsdcard%2Fdropbox%2FTransfer%2Fconsent.pdf
sobre el que getContentResolver().query()
devuelve null
.
Para hacer las cosas más interesantes, el administrador de archivos sin nombre (obtuve este URI del registro del cliente) devolvió algo como:
/./sdcard/downloads/.bin
¿Existe una forma preferida de extraer el nombre del archivo de la URI o se debe recurrir al análisis de cadenas?
Respuestas:
developer.android.com tiene un buen código de ejemplo para esto: https://developer.android.com/guide/topics/providers/document-provider.html
Una versión condensada para simplemente extraer el nombre del archivo (asumiendo que "esto" es una Actividad):
fuente
file://
acontent://
en elonScanCompleted(String path, Uri uri)
método stackoverflow.com/a/5815005/2163045new String[]{OpenableColumns.DISPLAY_NAME}
como segundo parámetro a la consulta filtrará las columnas para una solicitud más eficiente.OpenableColumns.DISPLAY_NAME
no funcionó para mí, usé en suMediaStore.Files.FileColumns.TITLE
lugar.java.lang.IllegalArgumentException: Invalid column latitude
Desafortunadamente, esto se bloqueará para los videos al crear el cursor con un . ¡Funciona perfectamente para fotos!Estoy usando algo como esto:
fuente
cursor
no esclose()
d?Tomado de Recuperar información de archivo | Desarrolladores de Android
Recuperando el nombre de un archivo.
fuente
Si lo quieres corto, esto debería funcionar.
fuente
Formas más fáciles de obtener el nombre del archivo:
Si no le dan el nombre correcto, debe usar:
fuente
Utilizo el siguiente código para obtener el nombre de archivo y el tamaño de archivo de Uri en mi proyecto.
fuente
Para Kotlin, puede usar algo como esto:
fuente
La versión más condensada:
fuente
fuente
fuente
Mi versión de la respuesta es en realidad muy similar a la de @Stefan Haustein. Encontré la respuesta en la página del desarrollador de Android Recuperando información de archivo ; la información aquí está aún más condensada sobre este tema específico que en el sitio de la guía Storage Access Framework . En el resultado de la consulta, el índice de la columna que contiene el nombre del archivo es
OpenableColumns.DISPLAY_NAME
. Ninguna de las otras respuestas / soluciones para índices de columna funcionó para mí. A continuación se muestra la función de muestra:fuente
Primero, debe convertir su
URI
objeto enURL
objeto y luego usar elFile
objeto para recuperar un nombre de archivo:Eso es, muy fácil.
fuente
Función de Stefan Haustein para xamarin / c #:
fuente
Si desea tener el nombre del archivo con extensión, utilizo esta función para obtenerlo. También funciona con selecciones de archivos de Google Drive
fuente
Esto realmente funcionó para mí:
fuente
Por favor intente esto:
fuente
Combinación de todas las respuestas
Esto es a lo que he llegado después de leer todas las respuestas presentadas aquí, así como lo que algunos Airgram han hecho en sus SDK: una utilidad que he abierto en Github:
https://github.com/mankum93/UriUtilsAndroid/tree/master/app/src/main/java/com/androiduriutils
Uso
Tan simple como llamar
UriUtils.getDisplayNameSize()
. Proporciona tanto el nombre como el tamaño del contenido.Nota: solo funciona con un contenido: // Uri
Aquí hay un vistazo al código:
fuente