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?