J'utilise un gestionnaire de fichiers tiers pour sélectionner un fichier (PDF dans mon cas) dans le système de fichiers.
Voici comment je lance l'activité:
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);
Voici ce que j'ai dans 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);
}
}
}
}
L'extrait de code est emprunté aux instructions d' Open Intents File Manager disponibles ici:
http://www.openintents.org/en/node/829
Le but de if-elseest la rétrocompatibilité. Je me demande si c'est le meilleur moyen d'obtenir le nom du fichier car j'ai constaté que d'autres gestionnaires de fichiers renvoient toutes sortes de choses.
Par exemple, Documents ToGo renvoie quelque chose comme ce qui suit:
content://com.dataviz.dxtg.documentprovider/document/file%3A%2F%2F%2Fsdcard%2Fdropbox%2FTransfer%2Fconsent.pdf
sur quels getContentResolver().query()retours null.
Pour rendre les choses plus intéressantes, le gestionnaire de fichiers sans nom (j'ai obtenu cet URI du journal client) a renvoyé quelque chose comme:
/./sdcard/downloads/.bin
Existe-t-il un moyen préféré d'extraire le nom de fichier de l'URI ou doit-on recourir à l'analyse de chaînes?