Android получает песню из Media Store, если у вас есть идентификатор песни?

Я получил идентификатор песни из плейлиста в MediaStore, используя

long id = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Playlists.Members.AUDIO_ID));

и идентификатор правильный, но поскольку единственными доступными данными являются CONTENT_DIRECTORY, DEFAULT_SORT_ORDER, PLAYLIST_ID, PLAY_ORDER и _ID, я не уверен, как получить важные части песни. Мне нужно название, альбом, исполнитель и т. д., как если бы я просматривал MediaStore.Audio.Media, чтобы получить информацию о песне.

Я нашел ответ, который попытался изменить в соответствии со своими потребностями, но я не очень понимаю запросы или курсоры, я не уверен, как, если есть способ получить песню.

Если единственный способ сделать это — перебирать каждую песню, пока я не найду соответствующий идентификатор, я могу это сделать, но это крайне неэффективно, и должен быть лучший способ.

Заранее спасибо!


person Andrew No    schedule 02.05.2015    source источник
comment
Проверьте мой ответ ниже. Это поможет вам. stackoverflow.com/questions/30004653/   -  person Jay Shah    schedule 02.05.2015
comment
@Joy Я немного понимаю, как это применимо, но у меня есть только идентификатор песни. (На самом деле это arraylist типа long, который является идентификатором песни), но есть ли способ получить доступ к фактическим свойствам песни, чтобы я мог использовать их в своем классе Song?   -  person Andrew No    schedule 02.05.2015
comment
Да, из моего ответа вы можете получить все названия песен, имена их исполнителей, пути к песням, идентификаторы альбомов, а также изображение альбома. Вам нужен идентификатор песни вместе с ним? Вам необходимо использовать идентификатор песни?   -  person Jay Shah    schedule 02.05.2015
comment
@Jay Я вижу это, но он получает информацию обо всех песнях, чего я пытаюсь избежать. Мне нужна информация только об одной песне, идентификатор которой у меня есть.   -  person Andrew No    schedule 02.05.2015
comment
Да, теперь я понял. Вы можете передать аргументы выбора в методе getContentResolver(). это помогает...   -  person Jay Shah    schedule 03.05.2015


Ответы (1)


Мне удалось запросить песню по идентификатору, используя следующий код:

    Uri mediaContentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String[] projection = new String[] { MediaStore.Audio.Media._ID, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ALBUM,
            MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.ALBUM_ID};
    String selection = MediaStore.Audio.Media._ID + "=?";
    String[] selectionArgs = new String[] {"" + id}; //This is the id you are looking for

    Cursor mediaCursor = getContentResolver().query(mediaContentUri, projection, selection, selectionArgs, null);

    if(mediaCursor.getCount() >= 0) {
        mediaCursor.moveToPosition(0);
        String title = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
        String album = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
        String artist = mediaCursor.getString(mediaCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
        long duration = mediaCursor.getLong(mediaCursor.getColumnIndex(MediaStore.Audio.Media.DURATION));

        //Do something with the data
    }

Вы можете запрашивать разные вещи, изменяя selection и selectionArgs. Вот документация из функции запроса:

  /* 
  Query the given URI, returning a {@link Cursor} over the result set.
  For best performance, the caller should follow these guidelines:
   - Provide an explicit projection, to prevent reading data from storage that aren't going to be used.
   - Use question mark parameter markers such as 'phone=?' instead of explicit values in the {@code selection} parameter, so that queries that differ only by those values will be recognized as the same for caching purposes.

   @param uri The URI, using the content:// scheme, for the content to retrieve.
   @param projection A list of which columns to return. Passing null will return all columns, which is inefficient.
   @param selection A filter declaring which rows to return, formatted as an SQL WHERE clause (excluding the WHERE itself). Passing null will return all rows for the given URI.
   @param selectionArgs You may include ?s in selection, which will be replaced by the values from selectionArgs, in the order that they appear in the selection. The values will be bound as Strings.
   @param sortOrder How to order the rows, formatted as an SQL ORDER BY clause (excluding the ORDER BY itself). Passing null will use the default sort order, which may be unordered.
   @return A Cursor object, which is positioned before the first entry, or null
   @see Cursor
 */

  public final Cursor query(Uri uri, String[] projection,
        String selection, String[] selectionArgs, String sortOrder)
person l-l    schedule 14.05.2015
comment
Спасибо! Это был идеальный пример, который я искал. - person Andrew No; 16.05.2015