【达内课程】ContentProvider(下)

本文介绍如何在音乐播放器中实现歌曲与封面图的对应显示。通过解析数据库表结构,利用ContentResolver查询音频和封面信息,并在列表项中展示歌曲标题、时长及封面图。

接着上一节修改音乐播放器3.0。

上一节到处的数据库中 audio 表,存储着歌曲信息;album_info 表,存储着封面信息

那么怎么让图片和歌曲对应起来?需要通过 audio 表中的album_key找到album_info中相等的album_key以此来拿到album_art(封面图的存储路径)

Music类中增加

public String getAlbumKey() {
        return albumKey;
    }

    public void setAlbumKey(String albumKey) {
        this.albumKey = albumKey;
    }

    public String getAlbumArt() {
        return albumArt;
    }

    public void setAlbumArt(String albumArt) {
        this.albumArt = albumArt;
    }

MediaStoreMusicDao 中修改getData()方法,查询album_art字段

public class MediaStoreMusicDao implements IDao<Music> {
    private Context content;

    public MediaStoreMusicDao(Context content) {
        this.content = content;
    }

    @Override
    public List<Music> getData() {
        //声明返回值
        List<Music> musics = new ArrayList<>();
        //准备ContentResolver
        ContentResolver cr = content.getContentResolver();
        //准备Uri
        Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
        //读数据,获取Cursor对象
        String[] projection = {
                "_id",//0
                "_data",//1->path
                "title",//2
                "duration",//3
                "album",//4
                "artist",//5
                "album_artist",//6
                "album_key"//7
        };//读取的字段
        String selection = null;
        String[] selectionArgs = null;
        String sortOrder = null;
        Cursor c = cr.query(uri, projection, selection, selectionArgs, sortOrder);
        //遍历Cursor,向返回值中添加数据
        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
            Music music = new Music();
            music.setId(c.getLong(0));
            music.setPath(c.getString(1));
            music.setTitle(c.getString(2));
            music.setDuration(c.getInt(3));
            music.setAlbum(c.getString(4));
            music.setArtist(c.getString(5));
            music.setAlbumArtist(c.getString(6));
            music.setAlbumKey(c.getString(7));
            music.setAlbumArt(getAlbumArtByKey(music.getAlbumKey()));
            musics.add(music);
        }
        //释放资源
        c.close();
        c = null;
        return musics;
    }

    //根据albumkey获取albumart
    private String getAlbumArtByKey(String key) {
        //准备返回值
        String albumArt = null;
        if (key != null) {
            //准备ContentSolver
            ContentResolver cr = content.getContentResolver();
            //准备Uri
            Uri uri = MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI;
            //执行查询获取Cursor
            String[] projection = {"album_art"};
            String selection = "album_key=?";
            String[] selectionArgs = {key};
            Cursor c = cr.query(uri, projection, selection, selectionArgs, null);
            //分析Cursor
            if (c.moveToFirst()) {
                albumArt = c.getString(c.getColumnIndex("album_art"));
            }
            //释放资源
            c.close();
            c = null;
        }
        return albumArt;
    }
}

查询到了album_art现在在列表中显示出来,item_music布局修改如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dp">

    <ImageView
        android:id="@+id/img_music_art"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginRight="10dp" />

    <TextView
        android:id="@+id/tv_music_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/img_music_art"
        android:maxLines="1"
        android:text="title"
        android:textColor="#222222"
        android:textSize="15dp" />

    <TextView
        android:id="@+id/tv_music_duration"
        android:layout_width="50dp"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginLeft="10dp"
        android:maxLines="1"
        android:text="00:00"
        android:textColor="#222222"
        android:textSize="15dp" />

    <TextView
        android:id="@+id/tv_music_album"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_below="@+id/tv_music_title"
        android:layout_toRightOf="@+id/img_music_art"
        android:maxLines="1"
        android:text="path......"
        android:textColor="#999999"
        android:textSize="15dp" />

    <TextView
        android:id="@+id/tv_music_artist"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_below="@+id/tv_music_title"
        android:layout_marginLeft="10dp"
        android:layout_toRightOf="@+id/tv_music_album"
        android:maxLines="1"
        android:text="path......"
        android:textColor="#999999"
        android:textSize="15dp" />
</RelativeLayout>

MusicAdapter修改一下以便能展示缩略图

public class MusicAdapter extends BaseAdapter<Music> {
    public MusicAdapter(Context context, List data) {
        super(context, data);
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        Music music = getData().get(i);
        ViewHolder holder;
        if (view == null) {
            view = getInflater().inflate(R.layout.item_music, null);
            holder = new ViewHolder();
            holder.title = view.findViewById(R.id.tv_music_title);
            holder.duration = view.findViewById(R.id.tv_music_duration);
            holder.album = view.findViewById(R.id.tv_music_album);
            holder.artist = view.findViewById(R.id.tv_music_artist);
            holder.musicart = view.findViewById(R.id.img_music_art);
            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }
        holder.title.setText(music.getTitle());
        holder.duration.setText(CommonUtils.getFormattedTime(music.getDuration()));
        holder.album.setText(music.getAlbum());
        holder.artist.setText(music.getArtist());

        String imagePath = music.getAlbumArt();
        if (imagePath != null) {
            Bitmap bitmap = BitmapFactory.decodeFile(music.getAlbumArt());
            holder.musicart.setImageBitmap(bitmap);
        } else {
            holder.musicart.setImageResource(R.mipmap.ic_launcher);
        }
        return view;
    }

    class ViewHolder {
        TextView title;
        TextView duration;
        TextView album;
        TextView artist;
        ImageView musicart;
    }
}

源码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值