MediaStore选择查询只返回一条记录

问题描述 投票:0回答:1

我想开发音乐播放器,我做了一个加载器和适配器,用于从mediastore获取数据,但当我从我的应用程序中调用查询时,它只返回一行,我不知道我的代码有什么问题,你能帮我解决这个问题吗?

这是我的加载器,它应该返回一个列表,我将在另一个地方使用。

public static List<Song> getAllArtistSongs(Context context, long artist_id){
    List<Song> ArtistSongList = new ArrayList<>();
    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String[] projection = new String[]{
            "_id",
            "title",
            "album_id",
            "album",
            "artist",
            "duration",
            "track"
    };
    String sortorder = MediaStore.Audio.Media.DEFAULT_SORT_ORDER;
    String selection = "is_music=1 and artist_id="+artist_id;

    Cursor cursor = context.getContentResolver().query(uri, projection, selection, null, sortorder);
    assert cursor != null;
    if (cursor.moveToFirst()) {
            do {
                int trackNumber = cursor.getInt(6);
                while (trackNumber >= 1000) {
                    trackNumber -= 1000;
                }
                Long id = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));
                String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
                Long albumid = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));
                String albumname = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
                String artistname = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
                int duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
                ArtistSongList.add(new Song(id, title, albumid, albumname, artist_id, artistname, duration, trackNumber));
            } while (cursor.moveToNext());
        cursor.close();
    }
    return ArtistSongList;
}

这就是我用来绑定回收视图的适配器。

public void onBindViewHolder(@NonNull VH holder, int position) {
    Song song = artistSongList.get(position);
        if(song!=null){
            holder.ttv.setText(song.title);
            holder.dtv.setText(song.artistName);
            int trackN = song.trackNumber;
            if(trackN==0){
                holder.ntv.setText("_");
            }else holder.ntv.setText(String.valueOf(trackN));
        }
}

这就是我调用查询func的地方。

private void setupAlbumList() {
    System.out.println(artistId);
    songList = ArtistSongLoader.getAllArtistSongs(getActivity(), artistId);
    adapter = new ArtistSongAdapter(getActivity(), songList);
    recy.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL));
    recy.setAdapter(new ArtistSongAdapter(getActivity(), songList));
}

先谢谢你的帮助

android-recyclerview adapter loader android-contentresolver mediastore
1个回答
0
投票

我的例子是检索所有曲目。

private final String track_id = MediaStore.Audio.Media._ID;
private final String track_no = MediaStore.Audio.Media.TRACK;
private final String track_name = MediaStore.Audio.Media.TITLE;
private final String artist = MediaStore.Audio.Media.ARTIST;
private final String artist_id = MediaStore.Audio.Media.ARTIST_ID;
private final String duration = MediaStore.Audio.Media.DURATION;
private final String album = MediaStore.Audio.Media.ALBUM;
private final String composer = MediaStore.Audio.Media.COMPOSER;
private final String year = MediaStore.Audio.Media.YEAR;
private final String path = MediaStore.Audio.Media.DATA;
private final String date_added = MediaStore.Audio.Media.DATE_ADDED;

    public Cursor getAllTracks(Context context) {
    // gets all tracks
    if (context != null) {
        ContentResolver cr = context.getContentResolver();
        final String[] columns = {track_id, track_no, artist, track_name,
                album, duration, path, year, composer};
        return cr.query(uri, columns, null, null, null);
    } else {
        return null;
    }
}

那么你有

String selection = "is_music=1"

首先,你不需要is_music=1。对于多个曲目,你当然需要同一个艺术家的多个曲目。

返回艺术家的专辑

    public Cursor getArtistsAlbumcursor(Context context, String artistId) {
    ContentResolver cr = context.getContentResolver();
    final String _id = MediaStore.Audio.Media._ID;
    final String album_id = MediaStore.Audio.Media.ALBUM_ID;
    final String artistid = MediaStore.Audio.Media.ARTIST_ID;
    final String[] columns = {_id, album_id, artistid};
    if (artistId != null) {
        String where = artistid + " =?";
        String[] aId = {artistId};
        return cr.query(uri, columns, where, aId, null);
    } else {
        return null;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.