Получить содержимое Uri MediaStore из пути к файлу? - PullRequest
1 голос
/ 18 февраля 2011

У меня есть приложение, которое перечисляет все видео в MediaStore.(Мне нужно как внутреннее, так и внешнее хранилище).

В основном у меня есть два курсора, которые запрашивают MediaStore.Video.Media.EXTERNAL_CONTENT_URI и MediaStore.Video.Media.INTERNAL_CONTENT_URI.

Затем я используюMergeCursor для слияния этих запросов и отображения в ListView с помощью CursorAdapter.

Дело в том, что иногда я хочу удалить одно из видео, но мне нужен «URI контента» для этой операции, потому что я неУ меня есть способ определить место хранения выбранного видео.

У меня есть полный путь к файлу видео и идентификатор в MediaStore.

Как я могу получить "Content Uri" изПуть к файлу / Uri?

Ответы [ 2 ]

4 голосов
/ 23 июля 2012

Для ответа на вопрос в заголовке:

Мне нужно получить путь из URI и получить URI из путей в моем приложении. Бывший:

/**
 * 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;
}

Последний (который я делаю для видео, но также может быть использован для аудио или файлов или другого типа хранимого контента путем замены MediaStore.Audio (и т. Д.) На MediaStore.Video):

/**
 * 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;
}

Как правило, в столбце DATA MediaStore (или в любом из его подразделов, к которому вы обращаетесь) хранится путь к файлу, поэтому вы используете эту информацию для поиска.

2 голосов
/ 18 февраля 2011

Отвечая на мой вопрос :)

Найден простой и тривиальный (!) Способ найти хранилище пути: **

    if(selectedVideoPath.indexOf(Environment.getExternalStorageDirectory().getPath()) == 0)
    {
        getContentResolver().delete(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, 
                MediaStore.Video.Media._ID + "=" + videoId,
                null);
    }
    else {
        getContentResolver().delete(MediaStore.Video.Media.INTERNAL_CONTENT_URI, 
                MediaStore.Video.Media._ID + "=" + videoId,
                null);          
    }
...