Ich habe eine onActivityResult
Rückkehr von einer Mediastore-Bildauswahl, bei der ich einen URI für ein Bild erhalten kann, indem ich Folgendes verwende:
Uri selectedImage = data.getData();
Wenn Sie dies in eine Zeichenfolge konvertieren, erhalten Sie Folgendes:
content://media/external/images/media/47
Oder zu einem Pfad gibt:
/external/images/media/47
Ich kann jedoch anscheinend keinen Weg finden, dies in einen absoluten Pfad umzuwandeln, da ich das Bild in eine Bitmap laden möchte, ohne es irgendwo kopieren zu müssen. Ich weiß, dass dies mit dem URI und dem Content Resolver möglich ist, aber dies scheint beim Neustart des Telefons zu brechen. Ich denke MediaStore
, die Nummerierung bleibt zwischen den Neustarts nicht gleich.
android
uri
absolute-path
mediastore
Stealthcopter
quelle
quelle
Antworten:
Verwenden Sie unter API 19 diesen Code, um den Dateipfad vom URI abzurufen:
quelle
Nur ein einfaches Update zur ersten Antwort:
mActivity.managedQuery()
ist jetzt veraltet. Ich habe den Code mit der neuen Methode aktualisiert.android dev source
quelle
content://...
Ding. Ich habe alle Vorschläge hier ohne Glück ausprobiert. Irgendeine Idee warum?Für Oreo
Für alle Versionen unter Oreo habe ich diese Methode erstellt, die einen echten Pfad von uri erhält
quelle
Versuchen Sie nicht, eine URL im Dateisystem zu finden.
Sie können eine Bitmap von einem Uri erhalten, indem Sie der Factory einen Eingabestream geben, wie Sie der Factory eine Datei geben:
quelle
Hier ist mein Beispiel für das Abrufen des Dateinamens von URI wie file: // ... und content: // .... Es funktioniert für mich nicht nur mit Android MediaStore, sondern auch mit Drittanbieteranwendungen wie EzExplorer.
quelle
Gute Antworten, von denen ich mir einige ausgedacht habe:
Ich muss den Pfad von URIs und den URI von Pfaden abrufen, und Google fällt es schwer, den Unterschied für jeden zu erkennen, der das gleiche Problem hat (z. B. das Miniaturbild
MediaStore
eines Videos abzurufen, dessen physischer Standort Sie bereits haben ). Das Vorherige:Letzteres (was ich für Videos mache, aber auch für Audio oder Dateien oder andere Arten von gespeicherten Inhalten verwendet werden kann, indem MediaStore.Audio (usw.) für MediaStore.Video ersetzt wird):
Grundsätzlich ist die
DATA
SpalteMediaStore
(oder in dem von Ihnen abgefragten Unterabschnitt) der Dateipfad gespeichert. Verwenden Sie also entweder das, was Sie wissen, um diesesDATA
Feld nachzuschlagen, oder verwenden Sie das Feld, um nachzuschlagen, was Sie sonst noch möchten.Ich benutze dann weiter
Scheme
wie oben, um herauszufinden, was ich mit meinen Daten machen soll:quelle
Keine dieser Antworten hat in allen Fällen für mich funktioniert. Ich musste direkt zu Googles Dokumentation https://developer.android.com/guide/topics/providers/document-provider.html zu diesem Thema gehen und fand diese nützliche Methode:
Mit dieser Bitmap können Sie sie in einer Bildansicht anzeigen.
quelle
API 19 und höher , Image File Path von Uri funktioniert einwandfrei. Ich überprüfe auch diese neueste PIE API 28 .
quelle
CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
auf diese Zeile:path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
Versuchen Sie dies, um den Pfad der Bilddatei von Uri abzurufen
quelle
Lösung für diejenigen, die nach dem Wechsel zu KitKat Probleme haben:
"Dadurch wird der Dateipfad vom MediaProvider, DownloadsProvider und ExternalStorageProvider abgerufen, während auf die inoffizielle ContentProvider-Methode zurückgegriffen wird" https://stackoverflow.com/a/20559175/690777
quelle
Nachdem Sie ein Bild aus der Galerie erhalten haben, übergeben Sie den URI in der folgenden Methode nur für Android 4.4 (KitKat):
quelle
Versuche dies
Wenn Sie jedoch das Problem haben, den richtigen Weg zu finden, können Sie meine Antworten ausprobieren. Die obigen Antworten haben mir nicht geholfen.
Erläuterung : - Diese Methode ruft den URI ab und überprüft anschließend die API-Ebene Ihres Android-Geräts. Je nach API-Ebene wird der Real-Pfad generiert. Der Code zum Generieren der Methode für echte Pfade unterscheidet sich je nach API-Ebene.
Methode zum Abrufen des Real-Pfads vom URI
Verwenden Sie diese Methode wie folgt
Ausgabe:-
quelle
String wholeID = DocumentsContract.getDocumentId(uri);
:java.lang.RuntimeException: Failure delivering result
Ich habe so gemacht:
quelle
Da ManagedQuery veraltet ist, können Sie Folgendes versuchen:
quelle
Hier zeige ich Ihnen, wie Sie eine BROWSE-Schaltfläche erstellen. Wenn Sie darauf klicken, wird die SD-Karte geöffnet, Sie wählen eine Datei aus und als Ergebnis erhalten Sie den Dateinamen und den Dateipfad der ausgewählten Datei einer:
Ein Knopf, den Sie drücken werden
Die Funktion, die den resultierenden Dateinamen und den Dateipfad erhält
quelle
content://com.fsck.k9.attachmentprovider/34fc2cc9-aa46-45e9-9e3f-2f27f0457249/1/VIEW
. Nachdem ich die Methoden hier angewendet habe, erhalte ich immer noch den gleichen String, nicht den richtigen Pfad/mnt/sdcard/Android/data/com.fsck.k9/files/34fc2cc9-aa46-45e9-9e3f-2f27f0457249.db_att/1
. Irgendwelche Hinweise?Gibt es eine Möglichkeit für frühere Android Q , wenn MediaStore.Images.Media.DATA nicht mehr verfügbar ist? Dieses Feld wird in Android Q abgeschrieben:
https://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html#DATA
--- Bearbeitet
Soweit ich weiß, besteht die einzige Möglichkeit für Android Q darin, RELATIVE_PATH weiterzuleiten
https://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html#RELATIVE_PATH
quelle
Leicht modifizierte Version von @PercyPercy - sie wirft nicht und gibt nur null zurück, wenn etwas schief geht :
quelle
Hier erhalten Sie den Namen der Datei
quelle
Simpel und einfach. Sie können dies über die URI wie unten tun!
quelle
Diese Lösung funktioniert in jedem Fall:
In einigen Fällen ist es zu schwierig, den Pfad von der URL abzurufen. Warum brauchst du dann den Weg? Um die Datei an einen anderen Ort zu kopieren? Du brauchst den Weg nicht.
quelle
Perfekt für mich arbeitender fester Code aus diesem Beitrag :
quelle
Wenn Sie als Add-On überprüfen müssen, ob eine Datei vorhanden ist, bevor Sie versuchen, einen Eingabestream zu öffnen, können Sie den DocumentsContract verwenden.
(Kotlin-Code)
quelle
Da die obigen Antworten bei mir nicht funktioniert haben, ist hier die Lösung, die bei mir funktioniert hat:
Für> 19 und <= 19 API-Ebenen.
Diese Methode deckt alle Fälle ab, in denen filePath von uri abgerufen werden soll
quelle
Verwenden Sie Folgendes, um einen Dateipfad zu erhalten:
quelle
Überprüfen Sie unten Methode funktioniert super auch Oreo 8.1 ..
URI-Pfad Klasse:
quelle
Ich mache das mit einem Einzeiler:
val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri)
Wie im onActivityResult aussieht:
quelle
Die Dinge sind jetzt kompliziert, besonders nach API Level 29 Android Q. So sollten Sie den Dateinamen aus dem Inhalt Uri erhalten
und auf diese Weise erhalten Sie den vollständigen Pfad des Inhalts-Uri für alle Android-Versionen
quelle
Dies funktioniert perfekt für mich, wenn Ihre Systemversion über 19 ist. Ich hoffe, dies kann Ihnen helfen.
quelle
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
quelle