Datei konvertieren: Uri in Datei in Android

Lesezeit: 7 Minuten

Datei konvertieren Uri in Datei in Android
hpique

Wie konvertiere ich am einfachsten von a file: android.net.Uri zu einem File bei Android?

Habe folgendes versucht aber es geht 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());

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

    – Cesaren

    4. April 2012 um 14:06 Uhr

  • Siehe stackoverflow.com/questions/5657411/…

    – Zafirk

    2. November 2014 um 8:00 Uhr

  • Was macht assertEquals?

    – Huzaifa Asif

    30. Mai 2019 um 0:16 Uhr

  • Uri.fromFile Kontext funktioniert bei mir einfach nicht 🙁

    – Bucht

    6. September 2019 um 7:31 Uhr

1646259189 28 Datei konvertieren Uri in Datei in Android
Adil Hussein

Was du willst ist…

new File(uri.getPath());

… und nicht…

new File(uri.toString());

Notiz: uri.toString() gibt einen String im Format zurück: "file:///mnt/sdcard/myPicture.jpg"wohingegen uri.getPath() gibt einen String im Format zurück: "/mnt/sdcard/myPicture.jpg".

  • Was ist der Unterschied zwischen den beiden? Was macht toString tun?

    – Merlyn Morgan-Graham

    4. Dezember 2011 um 0:19 Uhr

  • url.toString() gibt einen String im folgenden Format zurück: “file:///mnt/sdcard/myPicture.jpg”, wohingegen url.getPath() gibt einen String in folgendem Format zurück: “/mnt/sdcard/myPicture.jpg”, dh ohne vorangestellten Schematyp.

    – Adil Hussain

    4. Dezember 2011 um 14:53 Uhr


  • Wenn der URI ein Images.Media.EXTERNAL_CONTENT_URI (z. B. von Intent.ACTION_PICK für die Galerie) ist, müssen Sie ihn wie in stackoverflow.com/q/6935497/42619 nachschlagen

    – Kleiber

    13. Januar 2012 um 4:15 Uhr

  • @Chlebta schau dir eine Bibliothek namens an Picasso zum einfachen Laden von Dateien (sogar URLs) in ImageViews.

    – Virat Singh

    10. Juli 2015 um 17:46 Uhr

  • Meistens bekomme ich open failed: ENOENT (No such file or directory) Wenn ich versuche, die mit dieser Datei angegebene Datei zu öffnen. Auch wenn der Uri beispielsweise der Inhalts-URI eines Bildes ist, funktioniert es definitiv nicht.

    – erschüttert

    6. August 2015 um 0:09 Uhr

1646259189 465 Datei konvertieren Uri in Datei in Android
Juan Camilo Rodríguez Durán

verwenden

InputStream inputStream = getContentResolver().openInputStream(uri);    

direkt und kopieren Sie die Datei. Siehe auch:

https://developer.android.com/guide/topics/providers/document-provider.html

  • Dies sollte viel, viel mehr positiv bewertet werden. ContentResolver ist das, was Sie sich anscheinend standardmäßig ansehen, um den Pfad von Android.Net.Uri aufzulösen.

    – Mike Makarow

    1. Juni 2019 um 16:48 Uhr

  • Ich möchte eine weitere UpVote hinzufügen, aber es stellt sich heraus, dass ich dies nur einmal tun kann!

    – Xenolion

    21. Mai 2020 um 10:46 Uhr

  • Wir haben eine Datei aus einer Auswahl ausgewählt und müssen die Datei dann zuerst kopieren? :/

    – M. Usman Khan

    22. Juli 2020 um 7:18 Uhr

  • @M.UsmanKhan es kommt darauf an. Wenn Sie die Datei später verwenden möchten, kopieren Sie sie. Andernfalls verwenden Sie es einfach als Eingabestrom. Sie sollten sich nicht darauf verlassen, dass andere Apps die Datei für Sie aufbewahren.

    – VaiTon

    8. Juli 2021 um 15:58 Uhr

  • @ VaiTon86 . Wir wollen ein File-Objekt von URI, ohne die Datei zu kopieren.

    – M. Usman Khan

    24. Juli 2021 um 10:31 Uhr

Datei konvertieren Uri in Datei in Android
Sankt Berde

Nach langem Suchen hat bei mir folgendes funktioniert:

File file = new File(getPath(uri));


public String getPath(Uri uri) 
    {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
        if (cursor == null) return null;
        int column_index =             cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        String s=cursor.getString(column_index);
        cursor.close();
        return s;
    }

  • managedQuery ist jetzt veraltet. verwenden getContentResolver().query(...) stattdessen, was auf API 11+ funktioniert. Fügen Sie eine Bedingung für Geräte hinzu, die älter als API 11 sind.

    – Kyle Falconer

    27. Mai 2014 um 15:05 Uhr

  • Dies gibt mir aus irgendeinem Grund null zurück. Und mein Android-URI gibt so etwas zurück: {content://com.android.providers.media.documents/document/image%3A2741} Android.Net.UriInvoker

    – erkinyldz

    10. Juli 2015 um 8:32 Uhr

  • Dies ist keine gute Lösung, da es nicht auf allen Plattformen funktioniert. Einige Geräte füllen diese Spalte nicht einmal aus. Ich empfehle, dies dem Inhaltsanbieter zu überlassen, wie von @CommonWare in der vorherigen Antwort vorgeschlagen

    – Liran Cohen

    25. Juli 2016 um 15:55 Uhr

  • Dies gilt nur für Bilddateien, was ist mit anderen?

    – Pratibha sarve

    9. Juni 2017 um 10:10 Uhr

  • Stellen Sie sicher, dass Sie Ihren URI von Intent.ACTION_PICK und nicht von Intent.ACTION_GET_CONTENT erhalten, da Letzteres kein MediaStore.Images.Media.DATA enthält

    – Denys Lobur

    4. Juni 2018 um 14:03 Uhr

Datei konvertieren Uri in Datei in Android
Hemant Kauschik

Android + Kotlin

  1. Abhängigkeit für Kotlin-Android-Erweiterungen hinzufügen:

    implementation 'androidx.core:core-ktx:{latestVersion}'

  2. Datei von uri abrufen:

    uri.toFile()

Android + Java

Einfach nach oben verschieben 😉

1641786845 618 Ist es moglich mit JQuery zu entfernen
viswajit76

Beste Lösung

Erstellen Sie eine einfache FileUtil-Klasse und verwenden Sie sie zum Erstellen, Kopieren und Umbenennen der Datei

ich benutzte uri.toString() und uri.getPath() aber nicht für mich arbeiten. Endlich habe ich diese Lösung gefunden.

import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.OpenableColumns;
import android.util.Log;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class FileUtil {
    private static final int EOF = -1;
    private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;

    private FileUtil() {

    }

    public static File from(Context context, Uri uri) throws IOException {
        InputStream inputStream = context.getContentResolver().openInputStream(uri);
        String fileName = getFileName(context, uri);
        String[] splitName = splitFileName(fileName);
        File tempFile = File.createTempFile(splitName[0], splitName[1]);
        tempFile = rename(tempFile, fileName);
        tempFile.deleteOnExit();
        FileOutputStream out = null;
        try {
            out = new FileOutputStream(tempFile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        if (inputStream != null) {
            copy(inputStream, out);
            inputStream.close();
        }

        if (out != null) {
            out.close();
        }
        return tempFile;
    }

    private static String[] splitFileName(String fileName) {
        String name = fileName;
        String extension = "";
        int i = fileName.lastIndexOf(".");
        if (i != -1) {
            name = fileName.substring(0, i);
            extension = fileName.substring(i);
        }

        return new String[]{name, extension};
    }

    private static String getFileName(Context context, Uri uri) {
        String result = null;
        if (uri.getScheme().equals("content")) {
            Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
            try {
                if (cursor != null && cursor.moveToFirst()) {
                    result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (cursor != null) {
                    cursor.close();
                }
            }
        }
        if (result == null) {
            result = uri.getPath();
            int cut = result.lastIndexOf(File.separator);
            if (cut != -1) {
                result = result.substring(cut + 1);
            }
        }
        return result;
    }

    private static File rename(File file, String newName) {
        File newFile = new File(file.getParent(), newName);
        if (!newFile.equals(file)) {
            if (newFile.exists() && newFile.delete()) {
                Log.d("FileUtil", "Delete old " + newName + " file");
            }
            if (file.renameTo(newFile)) {
                Log.d("FileUtil", "Rename file to " + newName);
            }
        }
        return newFile;
    }

    private static long copy(InputStream input, OutputStream output) throws IOException {
        long count = 0;
        int n;
        byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
        while (EOF != (n = input.read(buffer))) {
            output.write(buffer, 0, n);
            count += n;
        }
        return count;
    }
}

Verwenden Sie die FileUtil-Klasse in Ihrem Code

try {
         File file = FileUtil.from(MainActivity.this,fileUri);
         Log.d("file", "File...:::: uti - "+file .getPath()+" file -" + file + " : " + file .exists());

  } catch (IOException e) {
          e.printStackTrace();
  }

  • Dies funktioniert, aber wenn ich ein Bild aus der Galerie auswähle, wird ein Fehler in der folgenden Zeile ausgegeben: InputStream inputStream = context.getContentResolver().openInputStream(uri);

    – Vahid Akbari

    16. November 2018 um 0:32 Uhr


  • Es hat sehr gut funktioniert, aber es löst FileNotFoundException auf einigen Android-Geräten aus.

    – viswajit76

    17. November 2018 um 4:11 Uhr

  • Verwenden Sie diesen Code, um ein Foto von der Kamera auszuwählen stackoverflow.com/a/51095098/7008132

    – viswajit76

    6. Januar 2020 um 3:31 Uhr


EDIT: Entschuldigung, ich hätte vorher besser testen sollen. Das sollte funktionieren:

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

URI ist java.net.URI.

  • Dies funktioniert, aber wenn ich ein Bild aus der Galerie auswähle, wird ein Fehler in der folgenden Zeile ausgegeben: InputStream inputStream = context.getContentResolver().openInputStream(uri);

    – Vahid Akbari

    16. November 2018 um 0:32 Uhr


  • Es hat sehr gut funktioniert, aber es löst FileNotFoundException auf einigen Android-Geräten aus.

    – viswajit76

    17. November 2018 um 4:11 Uhr

  • Verwenden Sie diesen Code, um ein Foto von der Kamera auszuwählen stackoverflow.com/a/51095098/7008132

    – viswajit76

    6. Januar 2020 um 3:31 Uhr


Nichts davon funktioniert bei mir. Ich habe festgestellt, dass dies die funktionierende Lösung ist. 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();

  • Das sollte eine Antwort sein! 🙂 Ich habe es auf API 25 getestet.

    – Ironie

    19. Dezember 2017 um 5:31 Uhr

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

    – CommonsWare

    24. Mai 2019 um 10:59 Uhr

916660cookie-checkDatei konvertieren: Uri in Datei in Android

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy