508 Stimmen

Datei konvertieren: Uri in Datei in Android

Wie konvertiert man am einfachsten von einer android.net.Uri Objekt, das eine file: Typ zu einer File Objekt in Android?

Ich habe das Folgende versucht, aber es funktioniert nicht:

File file = new File(Environment.getExternalStorageDirectory(), "read.me");
Uri uri = Uri.fromFile(file);
File auxFile = new File(uri.toString());
assertEquals(file.getAbsolutePath(), auxFile.getAbsolutePath());

0 Stimmen

Hier ist meine Lösung!! Es funktioniert gut! stackoverflow.com/questions/2789276/

1 Stimmen

0 Stimmen

Was bewirkt assertEquals?

25voto

Matthew Flaschen Punkte 266507

EDIT: Sorry, ich hätte vorher besser testen sollen. Dies sollte funktionieren:

new File(new URI(androidURI.toString()));

URI ist java.net.URI.

5 Stimmen

Aber die Frage lautet Uri, nicht URI. Darauf muss man aufpassen :)

1 Stimmen

@Muz, ich glaube, die Antwort ist richtig. androidURI ist eine Android.net.Uri. java.net.URI (die unter Android existiert) wird nur als Teil des Konvertierungsprozesses verwendet.

2 Stimmen

Können wir nicht einfach tun: new File(uri.getPath());

15voto

Jacek Kwiecień Punkte 12035

Für mich funktioniert das alles nicht. Ich habe diese Lösung gefunden, die funktioniert. Aber mein Fall ist spezifisch für Bilder .

String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getActivity().getContentResolver().query(uri, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String filePath = cursor.getString(columnIndex);
cursor.close();

0 Stimmen

Das sollte eine Antwort sein! :) Ich habe es mit API 25 getestet.

8 Stimmen

Beachten Sie, dass diese Technik unter Android Q verboten ist. Sie können nicht mehr auf die DATA-Spalte zugreifen (und das war von vornherein ein unzuverlässiger Ansatz).

13voto

Volodymyr Punkte 6115

Mit Kotlin ist es sogar noch einfacher:

val file = File(uri.path)

Oder wenn Sie Folgendes verwenden Kotlin-Erweiterungen für Android :

val file = uri.toFile()

51 Stimmen

Schlechte Antwort, insbesondere für Bilder: "Uri lacks 'file' scheme: content://"

12voto

Mohsents Punkte 461

Eine andere Möglichkeit, dies zu erreichen, ist die Erstellung einer Temporäre Datei . um das zu tun:

fun createTmpFileFromUri(context: Context, uri: Uri, fileName: String): File? {
    return try {
        val stream = context.contentResolver.openInputStream(uri)
        val file = File.createTempFile(fileName, "", context.cacheDir)
        org.apache.commons.io.FileUtils.copyInputStreamToFile(stream,file)
        file
    } catch (e: Exception) {
        e.printStackTrace()
        null
    }
}

Wir verwenden Apache Commons Bibliothek FileUtils Klasse. Zum Hinzufügen zu Ihrem Projekt:

implementation "commons-io:commons-io:2.7"

Beachten Sie, dass SICHERSTELLEN Aufruf an file.delete() nach Gebrauch. Für weitere Informationen besuchen Sie bitte Dokumente.

4 Stimmen

Wurde getestet und funktioniert mit API 31

8voto

Blitz Punkte 5391

Wenn Sie eine Uri die den Anforderungen der DocumentContract dann wollen Sie wahrscheinlich nicht File . Wenn Sie mit Kotlin arbeiten, verwenden Sie DocumentFile um Dinge zu tun, die man in der alten Welt benutzen würde File für und verwenden ContentResolver um Streams zu erhalten.

Alles andere ist so gut wie garantiert kaputt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X