Android构造音乐播放器并实现获取本地音乐
2018-04-09 14:36
309 查看
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"> <!-- TODO: Update blank fragment layout --> <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"> <!-- TODO: Update blank fragment layout --> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="Online" android:textSize="30sp" /> </FrameLayout>
注意这个ListView是在OnlineFragment中的layout写的,主要的目的是让Activity能够左右滑动。
<LinearLayout xmlns:android="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" <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="50dp"> <TextView android:id="@+id/main_local_tv" android:textSize="20sp" android:gravity="center" android:text="本地音乐" android:layout_weight="1" android:layout_width="0dp" android:layout_height="50dp" /> <TextView android:id="@+id/main_online_tv" android:textSize="20sp" android:gravity="center" android:text="在线音乐" android:layout_weight="1" android:layout_width="0dp" android:layout_height="50dp" /> </LinearLayout> <android.support.v4.view.ViewPager android:id="@+id/main_vp" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v4.view.ViewPager> </LinearLayout>
这个是在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 List<Music>musicList; private Context context; public MusicAdapter(List<Music>musicList,Context context){ this.context=context; this.musicList=musicList; } @Override public int getCount() { return musicList.size(); } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; } @Override public 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 List<Music>musicList=new ArrayList<>(); public LocalFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View 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() { @Override public 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<Fragment> fragmentList; public MusicPagerAdapter(FragmentManager fm, List<Fragment> fragmentList) { super(fm); this.fragmentList=fragmentList; } @Override public Fragment getItem(int position) { return fragmentList.get(position); } @Override public 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 List<Fragment>fragmentList=new ArrayList<>(); @Override protected 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); } //绑定ID private void bindID() { localtv=findViewById(R.id.main_local_tv); onlinetv=findViewById(R.id.main_online_tv); viewPager=findViewById(R.id.main_vp); } @Override public 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; }
好了,我就知道这么多,其实有很多,但是我不怎么会讲,如果想学的话,还是要真的从头开始学,毕竟这个还是蛮难的。
相关文章推荐
- 22_Android中的本地音乐播放器和网络音乐播放器的编写,本地视频播放器和网络视频播放器,照相机案例,偷拍案例实现
- Android 音乐播放器的开发教程(五)本地音乐的获取及显示 ----- 小达
- 图片、缓存-Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(编码实现)-by小雨
- android获取本地音乐的专辑图片
- Android中利用ContentResolver获取本地音乐和相片
- Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(编码实现)
- Android--MediaPlayer(实现列表选歌,上一首,下一首,清空播放列表,搜索本地音乐文件)
- Android实现通过浏览器点击链接打开本地应用(APP),并获取到传递的数据
- Android开发本地及网络Mp3音乐播放器(六)实现独立音乐播放界面
- android 获取本地全部图片列表的实现及源码下载(二)
- Android开发本地及网络Mp3音乐播放器(六)实现独立音乐播放界面
- android获取本地音乐的专辑的图片
- Android中利用ContentResolver获取本地音乐和相片
- Android开发----音乐播放器(扫描本地音乐)
- Android本地缓存和远程图片获取的实现
- Android中利用ContentResolver获取本地音乐和相片
- Android开发本地及网络Mp3音乐播放器(四)实现音乐播放
- Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(编码实现)
- Android-服务与广播接收者实现本地音乐播放
- Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(编码实现)