Estou usando o gerenciador de arquivos de terceiros para escolher um arquivo (PDF, no meu caso) do sistema de arquivos.
É assim que eu inicio a atividade:
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);
Isso é o que eu tenho em 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);
}
}
}
}
O snippet de código é emprestado das instruções do Open Intents File Manager disponíveis aqui:
http://www.openintents.org/en/node/829
O objetivo if-elseé compatibilidade com versões anteriores. Eu me pergunto se essa é a melhor maneira de obter o nome do arquivo, pois descobri que outros gerenciadores de arquivos retornam todos os tipos de coisas.
Por exemplo, Documents ToGo retorna algo como o seguinte:
content://com.dataviz.dxtg.documentprovider/document/file%3A%2F%2F%2Fsdcard%2Fdropbox%2FTransfer%2Fconsent.pdf
em que getContentResolver().query()retorna null.
Para tornar as coisas mais interessantes, o gerenciador de arquivos sem nome (obtive este URI do log do cliente) retornou algo como:
/./sdcard/downloads/.bin
Existe uma maneira preferida de extrair o nome do arquivo do URI ou deve-se recorrer à análise de string?