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-else
ist 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?
Antworten:
developer.android.com hat einen schönen Beispielcode dafür: https://developer.android.com/guide/topics/providers/document-provider.html
Eine komprimierte Version, um nur den Dateinamen zu extrahieren (vorausgesetzt, "dies" ist eine Aktivität):
quelle
file://
incontent://
in deronScanCompleted(String path, Uri uri)
Methode stackoverflow.com/a/5815005/2163045new String[]{OpenableColumns.DISPLAY_NAME}
eines zweiten Parameters zur Abfrage werden die Spalten für eine effizientere Anforderung gefiltert.OpenableColumns.DISPLAY_NAME
hat bei mir nicht funktioniert, ich habeMediaStore.Files.FileColumns.TITLE
stattdessen verwendet.java.lang.IllegalArgumentException: Invalid column latitude
leider mit einem erstellt wird . Funktioniert aber perfekt für Fotos!Ich benutze so etwas:
quelle
cursor
ist das nichtclose()
d?Entnommen aus dem Abrufen von Dateiinformationen | Android-Entwickler
Abrufen des Dateinamens.
quelle
Wenn Sie es kurz haben möchten, sollte dies funktionieren.
quelle
Einfachste Möglichkeiten, um den Dateinamen zu erhalten:
Wenn sie Ihnen nicht den richtigen Namen geben, sollten Sie Folgendes verwenden:
quelle
Ich verwende den folgenden Code, um den Dateinamen und die Dateigröße von Uri in meinem Projekt abzurufen.
quelle
quelle
Für Kotlin können Sie Folgendes verwenden:
quelle
Die am meisten komprimierte Version:
quelle
quelle
Meine Version der Antwort ist der von @Stefan Haustein sehr ähnlich. Ich habe die Antwort auf der Android-Entwicklerseite gefunden. Abrufen von Dateiinformationen ; Die Informationen hier sind zu diesem speziellen Thema noch komprimierter als auf der Website des Storage Access Framework- Handbuchs. Im Ergebnis der Abfrage lautet der Spaltenindex mit dem Dateinamen
OpenableColumns.DISPLAY_NAME
. Keine der anderen Antworten / Lösungen für Spaltenindizes hat bei mir funktioniert. Unten ist die Beispielfunktion:quelle
Zuerst müssen Sie Ihr
URI
Objekt in einURL
Objekt konvertieren und dann mitFile
Objekt einen Dateinamen abrufen:Das war's, sehr einfach.
quelle
Stefan Haustein Funktion für Xamarin / c #:
quelle
Wenn Sie den Dateinamen mit der Erweiterung haben möchten, verwende ich diese Funktion, um ihn abzurufen. Es funktioniert auch mit Google Drive File Picks
quelle
Das hat bei mir tatsächlich funktioniert:
quelle
Bitte versuchen Sie dies:
quelle
Kombination aller Antworten
Folgendes habe ich erreicht, nachdem ich alle hier vorgestellten Antworten gelesen habe und was einige Airgram in ihren SDKs getan haben - ein Dienstprogramm, das ich auf Github als Open-Source-Version bereitgestellt habe:
https://github.com/mankum93/UriUtilsAndroid/tree/master/app/src/main/java/com/androiduriutils
Verwendung
So einfach wie anrufen ,
UriUtils.getDisplayNameSize()
. Es gibt sowohl den Namen als auch die Größe des Inhalts an.Hinweis: Funktioniert nur mit einem Inhalt: // Uri
Hier ist ein Blick auf den Code:
quelle