Korzystam z menedżera plików innej firmy, aby wybrać plik (w moim przypadku PDF) z systemu plików.
Tak rozpoczynam działanie:
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);
Oto, co mam w 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);
}
}
}
}
Fragment kodu jest zapożyczony z instrukcji Open Intents File Manager dostępnych tutaj:
http://www.openintents.org/en/node/829
Celem if-elsejest kompatybilność wsteczna. Zastanawiam się, czy to najlepszy sposób na uzyskanie nazwy pliku, ponieważ odkryłem, że inne menedżery plików zwracają wszelkiego rodzaju rzeczy.
Na przykład Documents ToGo zwracają coś podobnego do następującego:
content://com.dataviz.dxtg.documentprovider/document/file%3A%2F%2F%2Fsdcard%2Fdropbox%2FTransfer%2Fconsent.pdf
na który getContentResolver().query()wraca null.
Żeby było ciekawiej, nienazwany menedżer plików (dostałem ten URI z dziennika klienta) zwrócił coś takiego:
/./sdcard/downloads/.bin
Czy istnieje preferowany sposób wyodrębnienia nazwy pliku z identyfikatora URI, czy też należy skorzystać z analizy ciągu?