java - Android 播放列表内容未找到

标签 java android android-contentresolver mediastore

public static ArrayList<Song> getPlaylistcontent(Context context,
        long playlistID) {
    ArrayList<Song> songs = new ArrayList<Song>();

    final String idString = MediaStore.Audio.Playlists.Members._ID;
    final String dataString = MediaStore.Audio.Playlists.Members.DATA;

    String[] projection = new String[] { idString, dataString };
    Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external",
            playlistID);

    Cursor cursor = context.getContentResolver().query(uri, projection,
            null, null, null);

    if (cursor != null && cursor.moveToFirst()) {

        do {

            final String id = cursor.getString(cursor
                    .getColumnIndex(idString));
            final String path = cursor.getString(cursor
                    .getColumnIndex(dataString));

            Song song = getSong(context, path);
            if (song != null) {
                songs.add(song);
                Log.d("MyTAG", song.getName());
            }

        } while (cursor.moveToNext());

    }

    return songs;
}

public static ArrayList<Playlist> getAllPlaylists(Context context) {
    return helper_getPlaylists(context, null);
}

private static ArrayList<Playlist> helper_getPlaylists(Context context,
        String selection) {

    ArrayList<Playlist> playlists = new ArrayList<Playlist>();

    final String idString = MediaStore.Audio.Playlists._ID;
    final String nameString = MediaStore.Audio.Playlists.NAME;

    Uri externalUri = MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI;
    String projection[] = new String[] { idString, nameString };

    // sort by date added
    String sortOrder = MediaStore.Audio.Playlists.DATE_ADDED;

    Cursor audioCursor = context.getContentResolver().query(externalUri,
            projection, selection, null, sortOrder);

    if (audioCursor != null && audioCursor.moveToFirst()) {

        do {
            final String id = audioCursor.getString(audioCursor
                    .getColumnIndex(idString));
            final String name = audioCursor.getString(audioCursor
                    .getColumnIndex(nameString));

            Playlist playlist = new Playlist();
            playlist.setName(name);
            playlist.setID(id);
            playlists.add(playlist);

        } while (audioCursor.moveToNext());

    }

    return playlists;
}

这是我用来获取播放列表内容的 2 (3) 种方法。好吧,他们应该返回播放列表内容,但事实并非如此。 getSong() 方法 100% 有效,不是问题所在。我在程序的另一部分使用了它几千次,它速度很快,并且还在代码审查中进行了审查。

我在主 Activity 中调用getAllPlaylists(),在ListView中显示这些播放列表,当我单击一个项目时,我将启动一个应显示的新 Activity 该播放列表的项目。因此,我通过 Intent 传递单击的播放列表的 ID,并在新 Activity 中使用它(有效,并且我确实获得了正确的 ID)。

//MainActivity
Arraylist<Playlist> playlists = MediaManager.getAllPlaylists( this );

//New Activity
long playlistID = getIntent().getExtras().getLong("playlist_id"); //works. 

//in an asynctask in new activity
Arraylist<Song> playlistContent = MediaManager.getPlaylistContent( this, playlistID ); //is empty

这让我发疯!我做错了什么?

最佳答案

如果我是正确的,那么获取播放列表详细信息的 Intent 是有效的,你会得到_ids,但不会得到歌曲。请记住,_id 是每个播放列表项的行 ID,而不是 audio_id。我为此挣扎了一段时间。也许这是你的问题。 我是这样解决的:

public Cursor getPlaylistTracks(Context context, Long playlist_id) {
    Uri newuri = MediaStore.Audio.Playlists.Members.getContentUri(
            "external", playlist_id);
    ContentResolver resolver = context.getContentResolver();
    String _id = MediaStore.Audio.Playlists.Members._ID;
    String audio_id = MediaStore.Audio.Playlists.Members.AUDIO_ID;
    String artist = MediaStore.Audio.Playlists.Members.ARTIST;
    String album = MediaStore.Audio.Playlists.Members.ALBUM;
    String album_id = MediaStore.Audio.Playlists.Members.ALBUM_ID;
    String title = MediaStore.Audio.Playlists.Members.TITLE;
    String duration = MediaStore.Audio.Playlists.Members.DURATION;
    String location = MediaStore.Audio.Playlists.Members.DATA;
    String composer = MediaStore.Audio.Playlists.Members.COMPOSER;
    String playorder = MediaStore.Audio.Playlists.Members.PLAY_ORDER;
    String date_modified = MediaStore.Audio.Playlists.Members.DATE_MODIFIED;
    String[] columns = { _id, audio_id, artist, album_id,album, title, duration,
            location, date_modified, playorder, composer };
    Cursor cursor = resolver.query(newuri, columns, null, null, null);
    return cursor;
}

关于java - Android 播放列表内容未找到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25089861/

相关文章:

java - JDBC 领域找不到 mysql 驱动程序

java - 如何在java中实现图形数据结构?有现成的图书馆吗?

android - 为什么 ContentResolver 看不到其他应用添加的文件?

Android 从收件箱中获取短信,优化了读取所有消息并将它们分组的方式

android - WP7 到 Android,Android 上是否有独立存储模拟?

Android,检测哪个应用程序正在发送短信?

java - 从主程序退出的应用程序未停止运行

Java:类型删除器实现

android - 在 android ndk 中使用 Eigen

android - 将android应用程序连接到xampp