Как читать песни из облака Google или устройства

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

Проблема: я могу отобразить плейлисты и зарегистрировать выбор пользователей, но не могу отобразить песни из этого плейлиста.

Да, я вижу следующие вопросы:

Как запрашивать песни в плейлистах на Android SDK?< /а>

Учитывая Название музыкального плейлиста Android. Как найти песни в плейлисте?

Что такое аргумент String 'volumeName' MediaStore.Audio.Playlists.Members.getContentUri?

Как вы можете видеть в моем коде, я сделал все возможное, чтобы реализовать эти решения, но безрезультатно.

Что нужно иметь в виду: я тестирую это на Galaxy Nexus, поэтому без SD-карты. Только внутренняя память и музыка в облаке. Мне нужно, чтобы он работал в любом сценарии (внутреннем, внешнем или облачном). В настоящее время он не работает ни в одном из них.

//@SuppressWarnings ("serial)")
public class CreationActivity extends Activity {
private final String [] STAR= {"*"};
//reads in all songs to an array


@Override
public void onCreate (Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    //set layout view and assign to variable
    setContentView(R.layout.creation);
    TableLayout myLayout = (TableLayout)findViewById(R.id.creationLayout);

    try {
        Bundle extras = getIntent().getExtras();

        if (extras!=null){
            //get the desired playlist and ID
            String playlist = extras.getString("playlist");
            Long playlistID = extras.getLong("playlistID");
            ArrayList<song> songs = new ArrayList<song>();

            //read in the songs from the playlist
            String[] proj = {MediaStore.Audio.Playlists.Members.TITLE,
                    MediaStore.Audio.Playlists.Members.ARTIST,
                    MediaStore.Audio.Playlists.Members.DURATION};

            //method 1
            Cursor songCursor = getContentResolver().query(MediaStore.Audio.Playlists.Members.getContentUri(null,playlistID),
                    proj,
                    null,
                    null,
                    null);

            //method 2
            /*
            Cursor songCursor = getContentResolver().query(Uri.parse("content://com.google.android.music.MusicContent/playlists/members"),
                   proj,
                    null,
                    null,
                    null);
            */

            //method 3
            /*
            Uri membersUri = MediaStore.Audio.Playlists.Members.getContentUri("internal", playlistID);
            Cursor membersCursor = managedQuery(membersUri, STAR, null, null, null);
            */

            //then this part with methods 1 and 2
            /*
            if (songCursor.getCount() > 0) {
                songCursor.moveToFirst();
                do {
                    song currSong = new song();
                    currSong.title = songCursor.getString(0);
                    currSong.artist = songCursor.getString(1);
                    songs.add(currSong);
                } while (songCursor.moveToNext());
            }
            songCursor.close();
            */

            //or this part with method 3
        /*
            membersCursor.moveToFirst();
            for(int s= 0; s<membersCursor.getCount(); s++,                           
                      membersCursor.moveToNext()){
                  song currSong = new song();
                      currSong.title = songCursor.getString(0);
              currSong.artist = songCursor.getString(1);
          songs.add(currSong);
            }
            membersCursor.close();
            */

        }else{
            Toast.makeText(getBaseContext(), "No songs",Toast.LENGTH_LONG).show();
        }
    } catch (NumberFormatException e){
    }
}
}   

Никаких ошибок при компиляции. Но «К сожалению, музыкальное приложение неожиданно закрылось». каждый раз.

Спасибо за помощь!


person Scott Decker    schedule 06.08.2012    source источник
comment
Вы пробовали отлаживать? Видите, каковы значения ваших переменных? Пожалуйста, сделайте это и сообщите нам, в чем проблема. Довольно трудно помочь вам, когда вы все, что вы говорите, это «К сожалению, музыкальное приложение» неожиданно закрылось. Это все равно, что сказать своему врачу только это и ничего больше. Что-то меня беспокоит. Быть конкретными.   -  person Vishwa Patel    schedule 07.08.2012
comment
Подойдет... пройдет еще пару дней, но я вернусь к вам.   -  person Scott Decker    schedule 11.08.2012


Ответы (1)


Я понял. Ключевым моментом было использование идентификатора плейлиста в виде строки непосредственно в URI. См. код ниже.

Это часть, которая получит имена и идентификаторы плейлистов:

String[] proj = {MediaStore.Audio.Playlists.NAME, MediaStore.Audio.Playlists._ID};
    Uri playlistUri = Uri.parse("content://com.google.android.music.MusicContent/playlists");
    Cursor playlistCursor = getContentResolver().query(playlistUri, proj, null, null, null);
    if (playlistCursor.getCount() > 0) {
        playlistCursor.moveToFirst();
        do {
            nameList.add(playlistCursor.getString(0));
            idList.add(playlistCursor.getLong(1));
        } while (playlistCursor.moveToNext());
    }

Затем, когда у вас есть идентификатор плейлиста, вы можете запросить песни в плейлисте. Это часть кода, которая фактически запрашивает информацию и помещает ее в список массивов. ПРИМЕЧАНИЕ. «Песня» — это класс, который я определил в другом месте, где readSong — это метод, который присваивает значения различным значениям (название, исполнитель и т. д.).

ArrayList<song> songs = new ArrayList<song>();

            //read songs into library from the correct playlist
            String[] proj = {MediaStore.Audio.Playlists.Members.TITLE, MediaStore.Audio.Playlists.Members.ARTIST, MediaStore.Audio.Playlists.Members.DURATION, MediaStore.Audio.Playlists.Members._ID};
            Uri songUri = Uri.parse("content://com.google.android.music.MusicContent/playlists/" + playlistID + "/members");
            Cursor songCursor = getContentResolver().query(songUri, proj, null, null, null);
            if (songCursor.getCount() > 0) {
                songCursor.moveToFirst();
                do {
                    //create dummy song
                    song currSong = new song();
                    //read info to dummy var
                    currSong.readSong(songCursor);
                    //add instance to collection
                    songs.add(currSong);
                } while (songCursor.moveToNext());
            }
            songCursor.close();

Я надеюсь, что это поможет любому, кто боролся с этим!! Дайте мне знать, если у вас есть комментарии по моему методу или способам его улучшения!

person Scott Decker    schedule 18.08.2012
comment
Я думаю, что не очень умно вынимать материал из курсора, чтобы поместить его в какой-то список. Продолжайте использовать Cursor - CursorAdapter и т.д. - person Lubos Horacek; 30.01.2013
comment
Для меня это очень полезная информация, спасибо за публикацию! - person joe_deniable; 05.02.2017