Sto utilizzando un file manager di terze parti per scegliere un file (PDF nel mio caso) dal file system.
Ecco come avvio l'attività:
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);
Questo è quello che ho in 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);
}
}
}
}
Lo snippet di codice è preso in prestito dalle istruzioni di Open Intents File Manager disponibili qui:
http://www.openintents.org/en/node/829
Lo scopo di if-elseè la compatibilità con le versioni precedenti. Mi chiedo se questo sia il modo migliore per ottenere il nome del file poiché ho scoperto che altri gestori di file restituiscono ogni genere di cose.
Ad esempio, Documents ToGo restituisce qualcosa di simile al seguente:
content://com.dataviz.dxtg.documentprovider/document/file%3A%2F%2F%2Fsdcard%2Fdropbox%2FTransfer%2Fconsent.pdf
su cui getContentResolver().query()ritorna null.
Per rendere le cose più interessanti, il file manager senza nome (ho ottenuto questo URI dal registro del client) ha restituito qualcosa del tipo:
/./sdcard/downloads/.bin
Esiste un modo preferito per estrarre il nome del file dall'URI o si dovrebbe ricorrere all'analisi delle stringhe?