Ich verwende den Dateimanager eines Drittanbieters, um eine Datei (in meinem Fall PDF) aus dem Dateisystem auszuwählen.
So starte ich die Aktivität:
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);
Das habe ich 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);
}
}
}
}
Das Code-Snippet stammt aus den Anweisungen des Open Intents File Managers , die hier verfügbar sind:
http://www.openintents.org/en/node/829
Der Zweck von if-elseist Abwärtskompatibilität. Ich frage mich, ob dies der beste Weg ist, um den Dateinamen zu erhalten, da ich festgestellt habe, dass andere Dateimanager alle möglichen Dinge zurückgeben.
Beispielsweise geben Documents ToGo Folgendes zurück:
content://com.dataviz.dxtg.documentprovider/document/file%3A%2F%2F%2Fsdcard%2Fdropbox%2FTransfer%2Fconsent.pdf
auf die getContentResolver().query()zurückkehrtnull .
Um die Sache interessanter zu machen, hat der unbenannte Dateimanager (ich habe diesen URI aus dem Client-Protokoll erhalten) Folgendes zurückgegeben:
/./sdcard/downloads/.bin
Gibt es eine bevorzugte Methode zum Extrahieren des Dateinamens aus dem URI oder sollte auf das Parsen von Zeichenfolgen zurückgegriffen werden?