在线版音乐播放器APP(一)

今天主要完成从Media数据库中获取歌曲信息,然后布置在ui上,并在github上create了项目工程。

github地址: https://github.com/kwcn/OnlineMusic

具体内容:

使用RecyclerView布置fragment,RecyclerView.adpater提供了很多灵活的api,方便处理界面中的每个item。

ui布置:

1. layout: 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <FrameLayout
        android:id="@+id/fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></FrameLayout>
</LinearLayout>

fragment_base.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="kwcn.master.fragment.BaseFragment">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</FrameLayout>

item_base.xml

<?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="58dp">

    <ImageView
        android:id="@+id/img"
        android:layout_width="58dp"
        android:layout_height="58dp"
        android:layout_margin="4dp" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginStart="4dp"
        android:layout_toEndOf="@+id/img"
        android:orientation="vertical">

        <TextView
            android:id="@+id/txt1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ellipsize="end"
            android:lines="1"
            android:textSize="18sp" />

        <TextView
            android:id="@+id/txt2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ellipsize="end"
            android:lines="1"
            android:textSize="15sp" />
    </LinearLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_alignParentBottom="true"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_toEndOf="@+id/img"
        android:background="@android:color/holo_blue_light" />
</RelativeLayout>

2. activity中设置fragment:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        BaseFragment baseFragment = BaseFragment.newInstance();
        getFragmentManager().beginTransaction().replace(R.id.fragment, baseFragment).commit();
    }
}

3. fragment设置recyclerview和recyclerview.adpater。这里MediaDBHelper.getMusicInfoAll(context)的数据来自查询media数据库表中歌曲的信息,传入到adpter中。

public class BaseFragment extends Fragment {

    public RecyclerView mRecyclerView;

    public BaseAdapter mBaseAdapter;

    public BaseFragment() {
        // Required empty public constructor
    }

    public static BaseFragment newInstance() {
        return new BaseFragment();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
            savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_base, container, false);

        final Context context = getActivity().getApplicationContext();
        mRecyclerView = view.findViewById(R.id.recyclerView);
        mBaseAdapter = new BaseAdapter(MediaDBHelper.getMusicInfoAll(context), context);
        mRecyclerView.setAdapter(mBaseAdapter);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(context));
        return view;
    }
}

4. adpater中载入歌曲数据,与ui控件绑定:

public class BaseAdapter extends RecyclerView.Adapter<BaseAdapter.ViewHolder> {

    private Context mContext;

    private List<Music> mMusicList;

    public BaseAdapter(List<Music> list, Context context) {
        mMusicList = list;
        mContext = context;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return  new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout
                .item_base, parent, false));
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Music music = mMusicList.get(position);
        holder.mTxt1.setText(music.mTitle);
        holder.mTxt2.setText(music.mArtist);

        Bitmap bm = BitmapFactory.decodeFile(music.mAlbumArt);
        BitmapDrawable bmpDraw = new BitmapDrawable(bm);
        holder.mImg.setImageDrawable(bmpDraw);
    }

    @Override
    public int getItemCount() {
        return mMusicList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        private TextView mTxt1;

        private TextView mTxt2;

        private ImageView mImg;

        public ViewHolder(View itemView) {
            super(itemView);
            mTxt1 = itemView.findViewById(R.id.txt1);
            mTxt2 = itemView.findViewById(R.id.txt2);
            mImg = itemView.findViewById(R.id.img);
        }
    }
}

从Media数据库中获取歌曲信息:

1. 建立Music实体类,根据所需构造(这里应该封装变量,使用set和get方法控制变量,待优化):

public class Music implements MediaStore.MediaColumns {
    public final String mMediaId;
    public final String mPath;
    public final String mDisplayName;
    public final String mTitle;
    public final String mArtistId;
    public final String mArtist;
    public final String mAlbumId;
    public final String mAlbum;
    public final String mAlbumArt;

    public Music(String mMediaId, String mPath, String mDisplayName, String mTitle, String
            mArtistId, String mArtist, String mAlbumId, String mAlbum, String mAlbumArt) {
        this.mMediaId = mMediaId;
        this.mPath = mPath;
        this.mDisplayName = mDisplayName;
        this.mTitle = mTitle;
        this.mArtistId = mArtistId;
        this.mArtist = mArtist;
        this.mAlbumId = mAlbumId;
        this.mAlbum = mAlbum;
        this.mAlbumArt = mAlbumArt;
    }

    @Override
    public String toString() {
        return "mMediaId:[" + mMediaId + "] " + "mPath:[" + mPath + "] " + "mDisplayName:[" +
                mDisplayName + "] " + "mTitle:[" + mTitle + "] " + "mArtistId:[" + mArtistId + "]" +
                " " + "mArtist:[" + mArtist + "] " + "mAlbumId:[" + mAlbumId + "] " + "mAlbum:["
                + mAlbum + "] " + "mAlbumArt:[" + mAlbumArt + "]";
    }
}

2. 查询数据,构造music对象集合:

public class MediaDBHelper {
    public final static Uri MEDIA_URI = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;

    public final static Uri ALBUM_URI = MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI;

    public static List<Music> getMusicInfoAll(Context context) {
        String projection[] = {MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DATA,
                MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.TITLE, MediaStore
                .Audio.Media.ARTIST_ID, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media
                .ALBUM_ID, MediaStore.Audio.Media.ALBUM};
        try (Cursor c = context.getContentResolver().query(MEDIA_URI, projection, null, null,
                null, null)) {
            if (c != null && c.moveToFirst()) {
                List<Music> list = new ArrayList<>();
                do {
                    String albumId = c.getString(6);
                    Music music = new Music(c.getString(0), c.getString(1), c.getString(2), c
                            .getString(3), c.getString(4), c.getString(5), albumId, c.getString
                            (7), getAlbumArt(context, albumId));
                    list.add(music);
                } while (c.moveToNext());
                return list;
            }
        }
        return null;
    }

    @Nullable
    private static String getAlbumArt(Context context, @NonNull String albumId) {
        String projection[] = {MediaStore.Audio.AlbumColumns.ALBUM_ART};
        String selection = MediaStore.Audio.Albums._ID + "=" + albumId;
        try (Cursor c = context.getContentResolver().query(ALBUM_URI, projection, selection,
                null, null, null)) {
            if (c != null && c.moveToFirst()) {
                return c.getString(0);
            }
        }
        return null;
    }
}

实现效果:

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值