it-swarm.com.de

Holen Sie sich den Inhaltsuri aus dem Dateipfad in Android

Ich kenne den absoluten Pfad eines Bildes (zum Beispiel /sdcard/cats.jpg). Gibt es einen Weg zum Inhaltsuri für diese Datei? 

In meinem Code lade ich ein Bild herunter und speichere es an einem bestimmten Ort. Um das Bild aktuell in einer ImageView festzulegen, öffne ich die Datei mit dem Pfad, rufe die Bytes ab und erstelle eine Bitmap und setze die Bitmap in der ImageView. Dies ist ein sehr langsamer Prozess. Stattdessen könnte ich die Methode ImageView.setImageUri(uri) verwenden, wenn ich den Inhalt uri erhalten könnte.

222
pankajagarwal

Versuche es mit:

ImageView.setImageURI(Uri.fromFile(new File("/sdcard/cats.jpg")));

Oder mit:

ImageView.setImageURI(Uri.parse(new File("/sdcard/cats.jpg").toString()));
426

UPDATE

Hier wird davon ausgegangen, dass Ihre Medien (Image/Video) bereits zum Inhaltsmedienanbieter hinzugefügt wurden. Wenn nicht, können Sie das .__ nicht erhalten. Content-URL als genau das, was Sie möchten. Stattdessen wird es eine Datei Uri geben.

Ich hatte dieselbe Frage für meine Datei-Explorer-Aktivität. Sie sollten wissen, dass das contenturi for file nur Mediastore-Daten wie Bild, Audio und Video unterstützt. Ich gebe Ihnen den Code, um Bildinhalt zu erhalten, indem Sie ein Bild von SD-Karte auswählen. Probieren Sie diesen Code aus, vielleicht funktioniert es für Sie ...

public static Uri getImageContentUri(Context context, File imageFile) {
  String filePath = imageFile.getAbsolutePath();
  Cursor cursor = context.getContentResolver().query(
      MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
      new String[] { MediaStore.Images.Media._ID },
      MediaStore.Images.Media.DATA + "=? ",
      new String[] { filePath }, null);
  if (cursor != null && cursor.moveToFirst()) {
    int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
    cursor.close();
    return Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + id);
  } else {
    if (imageFile.exists()) {
      ContentValues values = new ContentValues();
      values.put(MediaStore.Images.Media.DATA, filePath);
      return context.getContentResolver().insert(
          MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
    } else {
      return null;
    }
  }
}
76
Jinal Jogiyani

// Dieser Code funktioniert für Bilder unter 2.2, nicht sicher, ob andere Medientypen vorhanden sind 

   //Your file path - Example here is "/sdcard/cats.jpg"
   final String filePathThis = imagePaths.get(position).toString();

   MediaScannerConnectionClient mediaScannerClient = new
   MediaScannerConnectionClient() {
    private MediaScannerConnection msc = null;
    {
        msc = new MediaScannerConnection(getApplicationContext(), this);
        msc.connect();
    }

    public void onMediaScannerConnected(){
        msc.scanFile(filePathThis, null);
    }


    public void onScanCompleted(String path, Uri uri) {
        //This is where you get your content uri
            Log.d(TAG, uri.toString());
        msc.disconnect();
    }
   };
15
AndroidDebaser

Die akzeptierte Lösung ist wahrscheinlich die beste Wahl für Ihre Zwecke, aber um die Frage in der Betreffzeile zu beantworten:

In meiner App muss ich den Pfad von URIs und den URI von Pfaden abrufen. Das Vorherige:

/**
 * Gets the corresponding path to a file from the given content:// URI
 * @param selectedVideoUri The content:// URI to find the file path from
 * @param contentResolver The content resolver to use to perform the query.
 * @return the file path as a string
 */
private String getFilePathFromContentUri(Uri selectedVideoUri,
        ContentResolver contentResolver) {
    String filePath;
    String[] filePathColumn = {MediaColumns.DATA};

    Cursor cursor = contentResolver.query(selectedVideoUri, filePathColumn, null, null, null);
    cursor.moveToFirst();

    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
    filePath = cursor.getString(columnIndex);
    cursor.close();
    return filePath;
}

Letzteres (was ich für Videos mache, kann aber auch für Audio oder Dateien oder andere Arten von gespeicherten Inhalten verwendet werden, indem MediaStore.Audio (usw.) für MediaStore.Video ersetzt wird):

/**
 * Gets the MediaStore video ID of a given file on external storage
 * @param filePath The path (on external storage) of the file to resolve the ID of
 * @param contentResolver The content resolver to use to perform the query.
 * @return the video ID as a long
 */
private long getVideoIdFromFilePath(String filePath,
        ContentResolver contentResolver) {


    long videoId;
    Log.d(TAG,"Loading file " + filePath);

            // This returns us content://media/external/videos/media (or something like that)
            // I pass in "external" because that's the MediaStore's name for the external
            // storage on my device (the other possibility is "internal")
    Uri videosUri = MediaStore.Video.Media.getContentUri("external");

    Log.d(TAG,"videosUri = " + videosUri.toString());

    String[] projection = {MediaStore.Video.VideoColumns._ID};

    // TODO This will break if we have no matching item in the MediaStore.
    Cursor cursor = contentResolver.query(videosUri, projection, MediaStore.Video.VideoColumns.DATA + " LIKE ?", new String[] { filePath }, null);
    cursor.moveToFirst();

    int columnIndex = cursor.getColumnIndex(projection[0]);
    videoId = cursor.getLong(columnIndex);

    Log.d(TAG,"Video ID is " + videoId);
    cursor.close();
    return videoId;
}

Grundsätzlich speichert die DATA -Spalte von MediaStore (oder welcher Unterabschnitt davon abgefragt wird) den Dateipfad, sodass Sie anhand dieser Informationen nachschlagen können.

14
Jon O

Sie können diese beiden Möglichkeiten je nach Verwendung verwenden

Uri uri = Uri.parse("String file location");

oder

Uri uri = Uri.fromFile(new File("string file location"));

Ich habe beide Wege und beide Werke ausprobiert.

6

Die einfachste und robusteste Methode zum Erstellen von Inhaltsuri content:// aus einer Datei ist die Verwendung von FileProvider . Von FileProvider zur Verfügung gestellte Uri-Dateien können auch zur gemeinsamen Nutzung von Dateien mit anderen Apps verwendet werden. Um File Uri von einem absoluten Pfad von File abzurufen, können Sie DocumentFile.fromFile (neue Datei (Pfad, Name)) verwenden. Es wird in Api 22 hinzugefügt und gibt für die folgenden Versionen Null zurück.

File imagePath = new File(Context.getFilesDir(), "images");
File newFile = new File(imagePath, "default_image.jpg");
Uri contentUri = getUriForFile(getContext(), "com.mydomain.fileprovider", newFile);
2
Thracian

Abrufen der Datei-ID, ohne Code schreiben zu müssen, einfach mit den CLI-Befehlen von adb Shell:

adb Shell content query --uri "content://media/external/video/media" | grep FILE_NAME | grep -Eo " _id=([0-9]+)," | grep -Eo "[0-9]+"
2
BogdanBiv

Sie können das folgende Code-Snippet ausprobieren 

    public Uri getUri(ContentResolver cr, String path){
    Uri mediaUri = MediaStore.Files.getContentUri(VOLUME_NAME);
    Cursor ca = cr.query(mediaUri, new String[] { MediaStore.MediaColumns._ID }, MediaStore.MediaColumns.DATA + "=?", new String[] {path}, null);
    if (ca != null && ca.moveToFirst()) {
        int id = ca.getInt(ca.getColumnIndex(MediaStore.MediaColumns._ID));
        ca.close();
        return  MediaStore.Files.getContentUri(VOLUME_NAME,id);
    }
    if(ca != null) {
        ca.close();
    }
    return null;
}
0
caopeng

Es ist spät, aber vielleicht hilft es jemandem in Zukunft.

Um den Inhalts-URI für eine Datei abzurufen, können Sie die folgende Methode verwenden:

FileProvider.getUriForFile(Context context, String authority, File file)

Es gibt den Inhalts-URI zurück.

Sehen Sie sich dies an, um zu erfahren, wie Sie ein FileProvider einrichten.

0
artenson.art98