Holen Sie sich den Inhalt von uri aus dem Dateipfad in android


Answers

AKTUALISIEREN

Hier wird davon ausgegangen, dass Ihr Medium (Bild / Video) bereits dem Content-Media-Provider hinzugefügt wurde. Wenn nicht, dann werden Sie nicht in der Lage sein, die Inhalts-URL genau so zu bekommen, wie Sie es möchten. Stattdessen wird es Datei Uri geben.

Ich hatte dieselbe Frage für meine Datei-Explorer-Aktivität. Sie sollten wissen, dass der Contenturi für Dateien nur Mediastores wie Bild, Audio und Video unterstützt. Ich gebe Ihnen den Code, um Bildinhalt zu erhalten, uri vom Wählen eines Bildes von sdcard. Versuchen Sie diesen Code, vielleicht wird es für Sie arbeiten ...

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;
    }
  }
}
Question

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

In meinem Code lade ich ein Bild herunter und speichere es an einem bestimmten Ort. Um das Bild in einem ImageView aktuell zu setzen, öffne ich die Datei mit dem Pfad, hole die Bytes und erstelle eine Bitmap und setze dann die Bitmap in der ImageView. Dies ist ein sehr langsamer Prozess, aber wenn ich den Inhalt uri bekommen könnte, dann könnte ich sehr einfach die Methode ImageView.setImageUri(uri)




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

In meiner App muss ich den Pfad von URIs abrufen 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 Files oder andere Arten von gespeichertem Inhalt verwendet werden, indem ich MediaStore.Audio (etc) für MediaStore.Video ersetze):

/**
 * 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 MediaStore die DATA Spalte von MediaStore (oder der von MediaStore Teilabschnitt) den Dateipfad, sodass Sie diese Informationen zum Nachschlagen verwenden.




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);
    }
    ca.close();
    return null;
}



Sie können diese beiden Möglichkeiten verwenden

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

oder

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

Ich habe beide Wege ausprobiert und beide funktioniert.




Links