Как получить Uri из MediaStore через путь к файлу? - PullRequest
7 голосов
/ 06 мая 2011

В моей программе я хочу сохранить выбранную мелодию звонка по пути к файлу, а затем установить ее в качестве текущей мелодии звонка.

Я получил URI рингтона из RingtonePreference и получил путь к файлу из базы данных MediaStore.

, например

Uri - content://media/internal/audio/media/29
Path - /system/media/audio/notifications/Ascend.mp3

Теперь, как мне получить рингтон Uri из пути к файлу, который я сохранил?

Поскольку рингтон уже существует в MediaStore, я попробовал следующие функции, но он не работает.

uriRingtone = MediaStore.Audio.Media.getContentUriForPath(szRingtonePath);

Uri отличается от того, что я получил от RingtonePreference.

uriRingtone - content://media/internal/audio/media

Как мне запросить MediaStore, чтобы получить нужный мне Uri?

p.s. причина, по которой я не сохраняю мелодию звонка Uri напрямую, заключается в том, что я обнаружил, что Uri для той же мелодии звонка может иногда меняться на некоторых устройствах.

Ответы [ 4 ]

5 голосов
/ 19 февраля 2015

Следующий код вернет абсолютный путь для содержимого Uri аудио, видео и изображения.

public static String getRealPathFromURI(Context context, Uri contentUri) {
        Cursor cursor = context.getContentResolver().query(contentUri, null, null, null, null);

        int idx;
        if(contentUri.getPath().startsWith("/external/image") || contentUri.getPath().startsWith("/internal/image")) {
            idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        }
        else if(contentUri.getPath().startsWith("/external/video") || contentUri.getPath().startsWith("/internal/video")) {
            idx = cursor.getColumnIndex(MediaStore.Video.VideoColumns.DATA);
        }
        else if(contentUri.getPath().startsWith("/external/audio") || contentUri.getPath().startsWith("/internal/audio")) {
            idx = cursor.getColumnIndex(MediaStore.Audio.AudioColumns.DATA);
        }
        else{
            return contentUri.getPath();
        }
        if(cursor != null && cursor.moveToFirst()) {
            return cursor.getString(idx);
        }
        return null;
    }
5 голосов
/ 01 июня 2011

Способ, которым вы можете восстановить URI рингтона, сохраненный в RingtonePreference, (насколько я знаю), зная название песни.Затем вы можете запросить его с помощью курсора, чтобы получить сохраненную мелодию _id, и с ее помощью вы можете создать URI:

String ringtoneTitle = "<The desired ringtone title>";
Uri parcialUri = Uri.parse("content://media/external/audio/media"); // also can be "content://media/internal/audio/media", depends on your needs
Uri finalSuccessfulUri;

RingtoneManager rm = new RingtoneManager(getApplicationContext()); 
Cursor cursor = rm.getCursor();
cursor.moveToFirst();

while(!cursor.isAfterLast()) {
    if(ringtoneTitle.compareToIgnoreCase(cursor.getString(cursor.getColumnIndex(MediaStore.MediaColumns.TITLE))) == 0) {
    int ringtoneID = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
        finalSuccessfulUri = Uri.withAppendedPath(parcialUri, "" + ringtoneID );
        break;
    }
    cursor.moveToNext();
}

, где finalSuccessful uri - это URI, указывающий на мелодию звонка в RingtonePreference.

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

Вы также можете сделать это более общим способом для любого контента в MediaStore. Я должен получить путь от 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 (или в любом из его подразделов, к которому вы обращаетесь) хранится путь к файлу, поэтому вы используете эту информацию для его поиска.

1 голос
/ 03 декабря 2013

@ dong221: использовать внутренний URI в качестве MediaStore.Audio.Media.INTERNAL_CONTENT_URI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...