Android构造音乐播放器并实现获取本地音乐

1.思路介绍

step1:构造项目和包
新建一个project会自己创一个MainActivity,然后创3个包分别是adapter(适配器)、entity(实体)、fragment(碎片; 片段)。
step2:进行layout(界面)布局。
使用ListView布局
step3:在entity包中创建公共类
在entity中创一个Music(java class中创建),并定义5个公共类title、artist、album、length、albump。
step4:在adapter包中创建适配器
先创一个MusicAdapter(java class中创建),开始写适配器内容。
step5:在fragment包中创2个fragment(在与Activity一起的Fragment创建,切记)
创2个fragment,一个叫LocalFragment,另一个叫OnlineFragment。其中在LocalFragment中进行绑定适配器并填充数据。
step6:在MainActivity中添加监听并绑定LocalFragment的适配器,并进行读取数据。
当然构造音乐播放器并实现获取本地音乐,并不是这么简单。其中还要对Activity中的layout进行布局,主要是MainActivity、LocalFragment、OnlineFragment的布局。还有获取本地音乐的权限问题,以及如何插入本地音乐和如何使用游标,这些都是需要思考的。

2代码演示

<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="com.example.ssq.wanyiyu.fragment.LocalFragment"><ListView
    android:id="@+id/local_listview"android:layout_width="match_parent"android:layout_height="match_parent">ListView>
FrameLayout>

其中ListView是在LocalFragment进行布局的,这样就可以用MainActivity进行绑定,最好不在别处进行布局。

<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="com.example.ssq.wanyiyu.fragment.OnlieFragment"><TextView
        android:layout_width="match_parent"android:layout_height="match_parent"android:text="Online"android:textSize="30sp" />
FrameLayout>

注意这个ListView是在OnlineFragment中的layout写的,主要的目的是让Activity能够左右滑动。


"http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical""horizontal"android:layout_width="match_parent"android:layout_height="50dp">"@+id/main_local_tv"android:textSize="20sp"android:gravity="center"android:text="本地音乐"android:layout_weight="1"android:layout_width="0dp"android:layout_height="50dp" />"@+id/main_online_tv"android:textSize="20sp"android:gravity="center"android:text="在线音乐"android:layout_weight="1"android:layout_width="0dp"android:layout_height="50dp" />
.support.v4.view.ViewPagerandroid:id="@+id/main_vp"android:layout_width="match_parent"android:layout_height="match_parent">.support.v4.view.ViewPager>

这个是在MainActivity中的layout写的,主要作用是将2个TextView与两个滑动进行绑定,就是页面左右滑动的时候本地音乐在线音乐一直都在。其中ViewPager,它是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换。


/*** Created by OldLee on 2017/12/18.*/public class Music {public String title;//歌名public String artist;//歌手public String album;//专辑public int length;//时长public Bitmap albumbmp;//专辑图片
}

这个是entity中Music(java class中创建)创的类主要是为了让adapter和fragment中适配器进行绑定。


/*** Created by OldLee on 2017/12/18.*///  改造适配器
public class MusicAdapter extends BaseAdapter {private ListmusicList;private Context context;public MusicAdapter(ListmusicList,Context context){this.context=context;this.musicList=musicList;}@Overridepublic int getCount() {return musicList.size();}@Overridepublic Object getItem(int i) {return null;}@Overridepublic long getItemId(int i) {return 0;}@Overridepublic View getView(int i, View view1, ViewGroup viewGroup) {View view=null;
ViewHolder viewHolder=null;
if (view1==null){view= LayoutInflater.from(context).inflate(R.layout.music_item,null);viewHolder=new ViewHolder();viewHolder.titletv=view.findViewById(R.id.music_item_title);viewHolder.artisttv=view.findViewById(R.id.music_item_artist);viewHolder.albumImageView=view.findViewById(R.id.music_item_bmp);view.setTag(viewHolder);
}else {view=view1;viewHolder= (ViewHolder) view.getTag();
}
Music music=musicList.get(i);
viewHolder.titletv.setText(music.title);
viewHolder.artisttv.setText(music.artist+" - "+music.album);
viewHolder.albumImageView.setImageBitmap(music.albumbmp);return view;}class ViewHolder{TextView titletv;TextView artisttv;ImageView albumImageView;}
}

这个是在MusicAdapter中打的,主要是为了配置适配器,并进行填充数据。

/*** A simple {@link Fragment} subclass.*/
public class LocalFragment extends Fragment {private ListView localListView;
private ListmusicList=new ArrayList<>();public LocalFragment() {// Required empty public constructor}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentView view=inflater.inflate(R.layout.fragment_local, container, false);localListView=view.findViewById(R.id.local_listview);intListview();//获取ContentResolver对象ContentResolver resolver=getContext().getContentResolver();//创建游标Cursor cursor=resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null,null,null,null);//游标归零cursor.moveToFirst();do {
String title=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
String artist=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
String album=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));
int albumpID=cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));Music m=new Music();
m.albumbmp=getAlbumArt(albumpID);
m.album=album;
m.artist=artist;
m.title=title;
musicList.add(m);}while (cursor.moveToNext());cursor.close();localListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView adapterView, View view, int i, long l) {Intent intent=new Intent(getActivity(), MusicActivity.class);intent.putExtra("title",musicList.get(i).title);intent.putExtra("artist",musicList.get(i).artist);intent.putExtra("album",musicList.get(i).album);getActivity().startActivity(intent);}});return view;}private void intListview() {musicList=new ArrayList<>();//变量初始化
//        Music m1=new Music();
//        m1.title="成都";
//        m1.artist="赵雷";
//        m1.album="成都";
//        Music m2=new Music();
//        m2.title="成都";
//        m2.artist="赵雷";
//        m2.album="成都";
//        musicList.add(m1);
//        musicList.add(m2);MusicAdapter adapter=new MusicAdapter(musicList,getActivity());localListView.setAdapter(adapter);}/*** 根据专辑ID获取专辑封面图* @param album_id 专辑ID* @return*/private Bitmap getAlbumArt(int album_id) {String mUriAlbums = "content://media/external/audio/albums";String[] projection = new String[]{"album_art"};Cursor cur = getActivity().getContentResolver().query(Uri.parse(mUriAlbums + "/" + Integer.toString(album_id)), projection, null, null, null);String album_art = null;if (cur.getCount() > 0 && cur.getColumnCount() > 0) {cur.moveToNext();album_art = cur.getString(0);}cur.close();Bitmap bm = null;if (album_art != null) {bm = BitmapFactory.decodeFile(album_art);} else {bm = BitmapFactory.decodeResource(getResources(), R.mipmap.default_cover);}return bm;}
}

这个是在LocalFragment学的,当然OnlineFragment没写什么,这里就不把代码写出来了,这里的LocalFragment主要作用与MusicAdapter差不多,也是绑定适配器,并进行填充数据。


/*** Created by OldLee on 2017/12/18.*/public class MusicPagerAdapter extends FragmentPagerAdapter {private List fragmentList;public MusicPagerAdapter(FragmentManager fm, List fragmentList) {super(fm);this.fragmentList=fragmentList;}@Overridepublic Fragment getItem(int position) {return fragmentList.get(position);}@Overridepublic int getCount() {return fragmentList.size();}
}

这个是对MusicPager进行赋值,好让MainActivity进行绑定。

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private TextView localtv;
private  TextView onlinetv;
private ViewPager viewPager;
private ListfragmentList=new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bindID();//添加监听localtv.setOnClickListener(this);onlinetv.setOnClickListener(this);LocalFragment localFragment=new LocalFragment();OnlieFragment onlieFragment=new OnlieFragment();fragmentList.add(localFragment);fragmentList.add(onlieFragment);//ViewPage绑定适配器MusicPagerAdapter pagerAdapter=new MusicPagerAdapter(getSupportFragmentManager(),fragmentList);viewPager.setAdapter(pagerAdapter);}
//绑定IDprivate void bindID() {localtv=findViewById(R.id.main_local_tv);onlinetv=findViewById(R.id.main_online_tv);viewPager=findViewById(R.id.main_vp);}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.main_local_tv:break;case R.id.main_online_tv:break;default:break;}}
}

这个是MainActivity中写的,主要是讲绑定的适配器进行赋值。

3注意点

1.添加插件
在bulid.gradle,自己的写的模块在。
在最下面dependencies中加一个compile‘com.的插件
联网后手动下载
2.创建游标

创建游标course//获取ContentResolver对象ContentResolver resolver=getContext().getContentResolver();//创建游标Cursor cursor=resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null,null,null,null);//游标归零cursor.moveToFirst();do {String title=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));String artist=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));String album=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM));Music m=new Music();m.album=album;m.artist=artist;m.title=title;musicList.add(m);}while (cursor.moveToNext());cursor.close();//游标结束

3ListView创建:
1实体类。
2行布局。
3适配器。
4填充数据。
5绑定适配器。
4.安卓权限
6.0一下版本加下每一句话

6.0以上版本需要下载插件
5.根据专辑ID继续获取专辑封面图

/**
* 根据专辑ID获取专辑封面图
* @param album_id 专辑ID
* @return
*/
private Bitmap getAlbumArt(int album_id) {
String mUriAlbums = "content://media/external/audio/albums";
String[] projection = new String[]{"album_art"};
Cursor cur = context.getContentResolver().query(Uri.parse(mUriAlbums + "/" + Integer.toString(album_id)), projection, null, null, null);
String album_art = null;
if (cur.getCount() > 0 && cur.getColumnCount() > 0) {
cur.moveToNext();
album_art = cur.getString(0);
}
cur.close();
Bitmap bm = null;
if (album_art != null) {
bm = BitmapFactory.decodeFile(album_art);
} else {
bm = BitmapFactory.decodeResource(getResources(), R.drawable.default_cover);
}
return bm;
}

好了,我就知道这么多,其实有很多,但是我不怎么会讲,如果想学的话,还是要真的从头开始学,毕竟这个还是蛮难的。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部