Android 从MediaStore到适配器/listview的相册列表

Android 从MediaStore到适配器/listview的相册列表,android,listview,adapter,mediastore,Android,Listview,Adapter,Mediastore,我可以列出mediastore中的所有歌曲,但我也想按艺术家/专辑/文件夹/流派/播放列表对它们进行排序 我通常使用游标查询自己的数据库,但在这种情况下这是无效的,我必须使用适配器。我可以通过更改参数来查询,但我不知道如何在适配器中对其进行分组(我找不到如何添加/使用GROUPBY),这意味着我需要每个艺术家/相册/文件夹/。。在适配器中仅使用一次,而不是针对每首歌曲 我试图在网上搜索,但没有找到答案。我在这里也找到了一些话题,但我还是不清楚。因此,我想请您向我展示一下: 谢谢你的建议。这将为你

我可以列出mediastore中的所有歌曲,但我也想按艺术家/专辑/文件夹/流派/播放列表对它们进行排序

我通常使用游标查询自己的数据库,但在这种情况下这是无效的,我必须使用适配器。我可以通过更改参数来查询,但我不知道如何在适配器中对其进行分组(我找不到如何添加/使用GROUPBY),这意味着我需要每个艺术家/相册/文件夹/。。在适配器中仅使用一次,而不是针对每首歌曲

我试图在网上搜索,但没有找到答案。我在这里也找到了一些话题,但我还是不清楚。因此,我想请您向我展示一下:


谢谢你的建议。

这将为你提供所有专辑:

public Cursor getAlbumAlbumcursor(Context context, Cursor cursor)
{
    String where = null;
    ContentResolver cr = context.getContentResolver();
    final Uri uri = MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI;
    final String _id = MediaStore.Audio.Albums._ID; 
    final String album_id = MediaStore.Audio.Albums.ALBUM_ID; 
    final String album_name =MediaStore.Audio.Albums.ALBUM;
    final String artist = MediaStore.Audio.Albums.ARTIST;
    final String[]columns={_id,album_name, artist};
    cursor = cr.query(uri,columns,where,null, null);
    return cursor;
}
这将为您提供所有曲目:

public Cursor getTrackTrackcursor(Context context, Cursor cursor)
{
    final String track_id = MediaStore.Audio.Media._ID; 
    final String track_no =MediaStore.Audio.Media.TRACK;
    final String track_name =MediaStore.Audio.Media.TITLE;
    final String artist = MediaStore.Audio.Media.ARTIST;
    final String duration = MediaStore.Audio.Media.DURATION;
    final String album = MediaStore.Audio.Media.ALBUM;
    final String composer = MediaStore.Audio.Media.COMPOSER;
    final String year = MediaStore.Audio.Media.YEAR;
    final String path = MediaStore.Audio.Media.DATA;
    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;

    ContentResolver cr =  context.getContentResolver();
    final String[]columns={track_id, track_no, artist, track_name,album, duration, path, year, composer};
    cursor = cr.query(uri,columns,null,null,null);
    return cursor;
}
这将获取所有播放列表:

 public  Cursor getandroidPlaylistcursor(Context context,Cursor cursor)
 {
     ContentResolver resolver = context.getContentResolver();
     final Uri uri=MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI;
     final String id = MediaStore.Audio.Playlists._ID;
     final String name = MediaStore.Audio.Playlists.NAME;
     final String[]columns = {id,name};
     final String criteria = MediaStore.Audio.Playlists.NAME.length() + " > 0 " ;
     final Cursor crplaylists = resolver.query(uri, columns, criteria, null,name + "    `ASC");
     return crplaylists;
 }
请注意不同uri的MediaStore.Audio.Media用于曲目,MediaStore.Audio.Albums用于专辑详细信息,MediaStore.Audio.Playlists用于播放列表

cr.query中的最后一个参数是排序顺序,我的播放列表显示了一个示例:name+“`ASC”,它按播放列表名称排序。 我希望这有帮助

我开发了一个应用程序,允许您管理/创建播放列表并使用这些技术。 或者在Google Play中搜索播放列表管理器。

public ArrayList getAlbumList(){
    public ArrayList<SongBeen> getAlbumList() {

            ArrayList<SongBeen> albumList=new ArrayList<SongBeen>();
            ContentResolver musicResolver = activity.getContentResolver();
            Uri musicUri =    android.provider.MediaStore.Audio.**Albums**.EXTERNAL_CONTENT_URI;
            Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);
            if(musicCursor!=null && musicCursor.moveToFirst()){

                int titleColumn = musicCursor.getColumnIndex
                        (android.provider.MediaStore.Audio.Media.TITLE);
                int idColumn = musicCursor.getColumnIndex
                        (android.provider.MediaStore.Audio.Media._ID);
                int artistColumn = musicCursor.getColumnIndex
                        (android.provider.MediaStore.Audio.Media.ARTIST);
                int albumColumn = musicCursor.getColumnIndex
                        (android.provider.MediaStore.Audio.Media.ALBUM);


                //add songs to list
                do {
                    SongBeen been=new SongBeen();


                    been.setId(musicCursor.getLong(idColumn));
                    been.setAlbum(musicCursor.getString(albumColumn));
                    been.setArtist(musicCursor.getString(artistColumn));


                    albumList.add(been);
            } 
                while (musicCursor.moveToNext());
            }
            return albumList;

        }
ArrayList albumList=新建ArrayList(); ContentResolver musicResolver=activity.getContentResolver(); Uri musicUri=android.provider.MediaStore.Audio.**相册**.外部内容\u Uri; 游标musicCursor=musicSolver.query(musicUri,null,null,null); if(musicCursor!=null&&musicCursor.moveToFirst()){ int titleColumn=musicCursor.getColumnIndex (android.provider.MediaStore.Audio.Media.TITLE); int idColumn=musicCursor.getColumnIndex (android.provider.MediaStore.Audio.Media.\u ID); int artistColumn=musicCursor.getColumnIndex (android.provider.MediaStore.Audio.Media.ARTIST); int albumColumn=musicCursor.getColumnIndex (android.provider.MediaStore.Audio.Media.ALBUM); //将歌曲添加到列表中 做{ songbee=新的songbee(); been.setId(musicCursor.getLong(idColumn)); been.setAlbum(musicCursor.getString(albumColumn)); been.setArtist(musicCursor.getString(artistColumn)); 相册列表。添加(已); } while(musicCursor.moveToNext()); } 返回相册列表; }
注:

更改相册或任何其他我们可以得到的东西


Uri musicUri=android.provider.MediaStore.Audio.Albums.EXTERNAL\u CONTENT\u Uri

为了解决这个问题,我创建了一个名为
CursorToListAdapter
的类,它不是
ArrayAdapter
的同级,它意味着适配器,就像将它装配到游标一样,可以像列表一样使用它。然后,您可以将其传递给ArrayAdapter(当然是子类化
getView
)以显示它,关于这一点的指南可以帮助您吗?(这是一个非常好的设计模式,但如果我误读了这个问题,我不会写这篇文章:P)你好,亚历克,是的,如果你愿意的话,我会很感激你的指导:)添加的标准
final String criteria=MediaStore.Audio.Playlists.NAME.length()+“>0”
没有任何作用,因为结果总是
“4>0”
。更好地检查名称不同于空字符串。我意识到传递光标是没有意义的,它只需要上下文
    public ArrayList<SongBeen> getAlbumList() {

            ArrayList<SongBeen> albumList=new ArrayList<SongBeen>();
            ContentResolver musicResolver = activity.getContentResolver();
            Uri musicUri =    android.provider.MediaStore.Audio.**Albums**.EXTERNAL_CONTENT_URI;
            Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);
            if(musicCursor!=null && musicCursor.moveToFirst()){

                int titleColumn = musicCursor.getColumnIndex
                        (android.provider.MediaStore.Audio.Media.TITLE);
                int idColumn = musicCursor.getColumnIndex
                        (android.provider.MediaStore.Audio.Media._ID);
                int artistColumn = musicCursor.getColumnIndex
                        (android.provider.MediaStore.Audio.Media.ARTIST);
                int albumColumn = musicCursor.getColumnIndex
                        (android.provider.MediaStore.Audio.Media.ALBUM);


                //add songs to list
                do {
                    SongBeen been=new SongBeen();


                    been.setId(musicCursor.getLong(idColumn));
                    been.setAlbum(musicCursor.getString(albumColumn));
                    been.setArtist(musicCursor.getString(artistColumn));


                    albumList.add(been);
            } 
                while (musicCursor.moveToNext());
            }
            return albumList;

        }