【达内课程】ContentProvider(下)

音乐存储在了mnt-sdcard-Music文件夹下

歌曲的缩略图则保存到了以下路径

我们可以导出这张图片,然后加一个图片的后缀,就可以预览了

这里写图片描述

打开audio表,存储这歌曲信息
这里写图片描述
打开album_info表,存储着封面信息
这里写图片描述

那么怎么让图片和歌曲对应起来?这就要靠album_key这个字段了,通过audio中的album_key找到album_info中相等的album_key以此来拿到album_art

album_art是封面图的存储路径

Music类中增加

    private String albumKey;
    private String albumArt;
    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字段

@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()));
        }

        //释放资源
        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布局修改如下:

<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:maxLines="1"
        android:text="title"
        android:textColor="#222222"
        android:textSize="15dp"
        android:layout_toRightOf="@+id/img_music_art"
        />
    <TextView
        android:id="@+id/tv_music_duration"
        android:layout_width="50dp"
        android:layout_height="wrap_content"
        android:maxLines="1"
        android:text="00:00"
        android:textColor="#222222"
        android:textSize="15dp"
        android:layout_alignParentRight="true"
        android:layout_marginLeft="10dp"
        />

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

    <TextView
        android:id="@+id/tv_music_artist"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:maxLines="1"
        android:layout_below="@+id/tv_music_title"
        android:text="path......"
        android:textColor="#999999"
        android:textSize="15dp"
        android:layout_toRightOf="@+id/tv_music_album"
        android:layout_marginLeft="10dp"
        />
</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;
    }
}

效果图

源码下载

https://download.csdn.net/download/u010356768/10450616

猜你喜欢

转载自blog.csdn.net/u010356768/article/details/80519268
今日推荐