Was ist der einfachste Weg, um in Android von einem file:
android.net.Uri
in einen zu konvertieren File
?
Versuchte Folgendes, aber es funktioniert nicht:
final File file = new File(Environment.getExternalStorageDirectory(), "read.me");
Uri uri = Uri.fromFile(file);
File auxFile = new File(uri.toString());
assertEquals(file.getAbsolutePath(), auxFile.getAbsolutePath());
Antworten:
Was Sie wollen, ist ...
... und nicht...
HINWEIS:
uri.toString()
Gibt einen String im Format: zurück"file:///mnt/sdcard/myPicture.jpg"
, währenduri.getPath()
ein String im Format: zurückgegeben wird"/mnt/sdcard/myPicture.jpg"
.quelle
toString
dasurl.toString()
Geben Sie einen String im folgenden Format zurück: "file: ///mnt/sdcard/myPicture.jpg", während Sieurl.getPath()
einen String im folgenden Format zurückgeben: "/mnt/sdcard/myPicture.jpg", dh ohne den Schematyp pre- Fest.open failed: ENOENT (No such file or directory)
wenn ich versuche, die damit angegebene Datei zu öffnen. Wenn der Uri beispielsweise der Inhalts-Uri eines Bildes ist, funktioniert er definitiv nicht.Nach langer Suche hat das für mich funktioniert:
quelle
managedQuery
ist jetzt veraltet. Verwenden SiegetContentResolver().query(...)
stattdessen, was unter API 11+ funktioniert. Fügen Sie eine Bedingung für Geräte hinzu, die älter als API 11 sind.verwenden
direkt und kopieren Sie die Datei. Siehe auch:
https://developer.android.com/guide/topics/providers/document-provider.html
quelle
EDIT: Sorry, ich hätte vorher besser testen sollen. Das sollte funktionieren:
URI ist java.net.URI.
quelle
androidURI
ist ein android.net.Uri. java.net.URI (das auf Android vorhanden ist) wird nur im Rahmen des Konvertierungsprozesses verwendet.java.lang.IllegalArgumentException: Expected file scheme in URI: content://com.shajeel.daily_monitoring.localstorage.documents.localstorage.documents/document/%2Fstorage%2Femulated%2F0%2FBook1.xlsx
Nach dieser Methode erhalte ich eine Ausnahme.Beste Lösung
Erstellen Sie eine einfache FileUtil-Klasse und verwenden Sie sie zum Erstellen, Kopieren und Umbenennen der Datei
Ich benutze
uri.toString()
unduri.getPath()
arbeite aber nicht für mich. Ich habe endlich diese Lösung gefunden.Verwenden Sie die FileUtil-Klasse in Ihrem Code
quelle
Nichts davon funktioniert bei mir. Ich fand, dass dies die funktionierende Lösung ist. Aber mein Fall ist spezifisch für Bilder .
quelle
Android + Kotlin
Abhängigkeit für Kotlin Android-Erweiterungen hinzufügen:
implementation 'androidx.core:core-ktx:{latestVersion}'
Datei von uri abrufen:
uri.toFile()
Android + Java
Einfach nach oben gehen;)
quelle
file
Mit Kotlin ist es noch einfacher:
Oder wenn Sie Kotlin-Erweiterungen für Android verwenden :
quelle
@ CommonsWare hat alles ganz gut erklärt. Und wir sollten wirklich die von ihm vorgeschlagene Lösung verwenden.
Übrigens sind nur Informationen, auf die wir uns beim Abfragen verlassen können,
ContentResolver
der Name und die Größe einer Datei, wie hier erwähnt: Abrufen von Dateiinformationen | Android-EntwicklerWie Sie sehen konnten, gibt es eine Schnittstelle
OpenableColumns
, die nur zwei Felder enthält: DISPLAY_NAME und SIZE.In meinem Fall musste ich EXIF-Informationen zu einem JPEG-Bild abrufen und bei Bedarf drehen, bevor ich sie an einen Server sendete. Dazu habe ich mit
ContentResolver
und einen Dateiinhalt in eine temporäre Datei kopiertopenInputStream()
quelle
Ich habe das folgendermaßen gemacht:
Im Grunde versuche ich zuerst, eine Datei zu verwenden, dh ein Bild, das mit der Kamera aufgenommen und auf einer SD-Karte gespeichert wurde. Dies funktioniert nicht für Bilder, die zurückgegeben werden von: Intent photoPickerIntent = new Intent (Intent.ACTION_PICK); In diesem Fall muss Uri nach
getRealPathFromURI()
Funktion in einen realen Pfad konvertiert werden. Die Schlussfolgerung ist also, dass es davon abhängt, welche Art von Uri Sie in Datei konvertieren möchten.quelle
Wenn Sie eine haben
Uri
, die der entspricht,DocumentContract
möchten Sie sie wahrscheinlich nicht verwendenFile
. Wenn Sie auf Kotlin sind, verwendenDocumentFile
Sie diese Option, um Dinge zu tun , für die Sie in der alten Welt verwendet wurdenFile
, undContentResolver
um Streams abzurufen .Alles andere ist so gut wie garantiert kaputt.
quelle
In diesem Fall, insbesondere unter Android, ist der Weg für Bytes normalerweise schneller.
Damit habe ich es gelöst, indem ich eine Klasse eingerichtet habe,
FileHelper
die die Verantwortung für das Lesen / Schreiben von Bytes aus / in Dateien über Stream und eine Klasse hatUriHelper
die die Verantwortung hat, den Pfad von Uri und die Erlaubnis herauszufinden.Soweit allgemein bekannt,
string.getBytes((charset == null) ? DEFAULT_CHARSET:charset)
kann es uns helfen, die gewünschte Zeichenfolge in die von Ihnen benötigten Bytes zu übertragen.Wie Sie mit UriHelper und FileHelper ein von Uri notiertes Bild in eine Datei kopieren können, können Sie ausführen:
über meinen UriHelper:
}}
über meinen FileHelper:
}}
quelle
Für Leute, die hier nach einer Lösung für Bilder suchen, ist dies besonders hier der Fall.
quelle
Datei imageToUpload = neue Datei (neuer URI (androidURI.toString ())); funktioniert, wenn dies eine Datei ist, die Sie im externen Speicher erstellt haben.
Zum Beispiel file: /// storage / emulated / 0 / (ein Verzeichnis und ein Dateiname)
quelle
public String getRealPathFromURI (Uri uri) {
Verwenden Sie dann, um die Datei vom URI abzurufen:
- HOFFNUNG KANN IHNEN HELFEN ----
quelle
Mit dem folgenden Code kann ich eine gemeinsam genutzte PDF-Datei für Adobe-Anwendungen als Stream abrufen und im Android-Anwendungspfad speichern
quelle
Erweiterungsbasis auf @Jacek Kwiecień Antwort für die Konvertierung von Bild-Uri in Datei
Wenn wir verwenden
File(uri.getPath())
, wird es nicht funktionierenWenn wir die Erweiterung von android-ktx verwenden , funktioniert sie immer noch nicht, da https://github.com/android/android-ktx/blob/master/src/main/java/androidx/core/net/Uri.kt
quelle
DATA
Spalte zugreifen (und das war in erster Linie ein unzuverlässiger Ansatz).Hinzufügen
onActivityResult
, Abrufen einer DocX- oder PDF-Dateiquelle