Android播放器的制作---畅想音乐播放器
来源:互联网 发布:java写界面应用 编辑:程序博客网 时间:2024/05/21 22:34
本人接触android零零碎碎也有一个月多了,我自己觉得也应该自己独立去做一些东西了,当然太难的我肯定不行,所以我就选择了播放器的制作。播放器虽然不是什么大项目,但是涉及的方面还是比较全的,例如Service,Broadcast,ContentProvider等等,如果深入地制作,比如说SQLite,Http也是能涉及到的。
该播放器的图片效果如下:
1.设计UI,这部分说简单也简单,说难也不难。UI设计是UI设计师应该做的事,我们是不用管太多的,所以做的界面不需要尽善尽美,只要不是太丑就行了,我是找了几张图片,用ps加工了一下。
2.设置欢迎界面,新建一个WelcomeActivity,然后在AndroidMainifest.xml中注册WelcomeActivity,然后用handler实现跳转
handler=new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { Intent intent=new Intent(WelcomeActivity.this,MainActivity.class); startActivity(intent); WelcomeActivity.this.finish(); } },1500);
3.设计MainAcivity的视图文件activity.xml,里面主要是一个ListView和一个操作栏文件。
<?xml version="1.0" encoding="utf-8"?><LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@mipmap/bg1" xmlns:android="http://schemas.android.com/apk/res/android"> <ListView android:id="@+id/music_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1"> </ListView> <RelativeLayout android:id="@+id/operate_menu" android:layout_width="match_parent" android:layout_height="50dp" android:layout_gravity="bottom" android:padding="0dp" android:gravity="bottom" android:background="@color/half_transparent" > <ImageView android:layout_marginLeft="3dp" android:id="@+id/music_album" android:layout_width="50dp" android:layout_height="50dp" android:src="@mipmap/music_album"/> <com.zhanghao.freemusicversion_one.UI.widget.MyTextView android:id="@+id/music_name" android:layout_width="75dp" android:layout_height="wrap_content" android:layout_toRightOf="@+id/music_album" android:clickable="true" android:singleLine="true" android:ellipsize="marquee" android:textColor="@color/black" android:layout_marginTop="4dp" android:text="@string/music_name"/> <TextView android:id="@+id/player_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/music_album" android:layout_below="@+id/music_name" android:text="@string/player_name" android:layout_marginTop="3dp" android:textSize="12sp" android:layout_marginLeft="2dp" android:textColor="@color/gray"/> <ImageButton android:id="@+id/play" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/play_btn_click" android:background="@color/transparent" android:layout_centerHorizontal="true" android:layout_centerVertical="true" /> <ImageButton android:id="@+id/next" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/next_btn_click" android:background="@color/transparent" android:layout_centerVertical="true" android:layout_toRightOf="@+id/play" android:layout_marginLeft="11dp" /> <ImageButton android:id="@+id/play_queue" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/playqueue_btn_click" android:background="@color/transparent" android:layout_centerVertical="true" android:layout_alignParentRight="true"/> </RelativeLayout></LinearLayout>
4.为listView创建数据源,然后创建适配器
* 数据源的创建,用ContentResolver()获取sd卡上的音乐信息
public static ArrayList<MusicBean> getMusicBeans(Context context){ //用ContentResolver获取音乐的基本信息 Cursor cursor=context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null,null,null,MediaStore.Audio.Media.DEFAULT_SORT_ORDER); ArrayList<MusicBean> list=new ArrayList<>(); MusicBean musicBean; for(int i=0;i<cursor.getCount();i++){ cursor.moveToNext(); musicBean=new MusicBean(); musicBean.setId(cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media._ID))); musicBean.setAlbum(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM))); musicBean.setArtist(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST))); musicBean.setDisplay(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME))); musicBean.setDuration(cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION))); musicBean.setSize(cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE))); musicBean.setTitle(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE))); musicBean.setUrl(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA))); musicBean.setIs_Music(cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.IS_MUSIC))); if(musicBean.getIs_Music()==1) list.add(musicBean); } return list; }* 创建适配器MusicListAdapter.class,这是继承于BaseAdapter的
public class MusicListAdapter extends BaseAdapter { private Context context; private ArrayList<MusicBean> list; public MusicListAdapter(Context context, ArrayList<MusicBean> list) { this.context=context; this.list=list; } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public int getCount() { return list.size(); } @Override public View getView(int position, View convertView, ViewGroup parent) { Holder holder; if(convertView==null){ holder=new Holder(); convertView=(View)LayoutInflater.from(context).inflate(R.layout.music_list_item,null); holder.item_music_id= (TextView) convertView.findViewById(R.id.item_music_id); holder.item_music_name= (MyTextView) convertView.findViewById(R.id.item_music_name); holder.item_music_artist= (TextView) convertView.findViewById(R.id.item_music_artist); convertView.setTag(holder); } else{ holder= (Holder) convertView.getTag(); } holder.item_music_id.setText(position+""); holder.item_music_name.setText(list.get(position).getTitle()); holder.item_music_artist.setText(list.get(position).getArtist()); return convertView; } class Holder{ TextView item_music_id; MyTextView item_music_name; TextView item_music_artist; }}
* 绑定数据
list= MediaUtils.getMusicBeans(this); //获取listView中需要使用的数据 /** * 设置listView的适配器 */ adapter=new MusicListAdapter(this,list); listView.setAdapter(adapter);
5.实现音乐的播放功能:
音乐的播放是在后台执行的,所以必须创建一个MusicPlayService.class类,在Service里面实现播放器的功能暂停,下一首等等。
public class MusicPlayService extends Service { private MyBroadcast myBroadcast; private MediaPlayer mediaPlayer=null; private String music_url;//音乐路径 public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); mediaPlayer=new MediaPlayer();//创建一个播放器 //注册广播 registerBroadcast(); } /** * 注册广播 * @return */ public void registerBroadcast(){ myBroadcast=new MyBroadcast(); IntentFilter intentFilter=new IntentFilter(); intentFilter.addAction(ActionContant.First_Open); registerReceiver(myBroadcast,intentFilter); } @Override public int onStartCommand(Intent intent, int flags, int startId) { /** * 首次启动 */ Log.i("info","onStartCommand"); if(intent.getAction().equals(ActionContant.First_Open)){ Log.i("info","error"); if(mediaPlayer!=null){ mediaPlayer.release(); mediaPlayer=new MediaPlayer(); } music_url = intent.getStringExtra(Constant.Music_Uri); OpenMediaPlayer(); /** * 发送广播 */ Intent intent1=new Intent(); intent1.setAction(ActionContant.First_Open); sendBroadcast(intent1); } else if(intent.getAction()==ActionContant.Pause){ Pause(); } else if(intent.getAction()==ActionContant.Wake){ Awake(); } else if(intent.getAction()==ActionContant.Next){ music_url=intent.getStringExtra(Constant.Music_Uri); Next(); } return super.onStartCommand(intent, flags, startId); } /** * 设置MediaPlayer数据来源 */ public void OpenMediaPlayer(){ mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { Intent intent=new Intent(); intent.setAction(ActionContant.Music_Play_Finish); intent.putExtra(Constant.Is_play_finish,true); sendBroadcast(intent); } }); try { mediaPlayer.setDataSource(this, Uri.parse(music_url)); } catch (IOException e) { e.printStackTrace(); } try { mediaPlayer.prepare(); } catch (IOException e) { e.printStackTrace(); } mediaPlayer.start(); } /** * 暂停 */ public void Pause(){ mediaPlayer.pause(); } /** * 唤醒 * @param * @param */ public void Awake(){ mediaPlayer.start(); } /** *下一首 */ public void Next(){ mediaPlayer.reset(); try { mediaPlayer.setDataSource(this,Uri.parse(music_url)); } catch (IOException e) { e.printStackTrace(); } try { mediaPlayer.prepare(); } catch (IOException e) { e.printStackTrace(); } mediaPlayer.start(); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); } @Override public void onDestroy() { Log.i("info","Service_Destroy"); super.onDestroy(); mediaPlayer.release(); }}
6.设置播放等按钮的点击事件,这方面就不贴代码了,原因是比较简单,但是就是要处理好各部分之间的逻辑关系。
7.获取专辑图片并显示在界面上:
/** * 获取专辑图片 * @param context * @param music_id * @return */ public static Bitmap getAlbumBitmap(Context context,long music_id){ Bitmap bitmap; String Music_album="content://media/external/audio/media/"+music_id+"/"+"albumart"; Uri uri=Uri.parse(Music_album); ParcelFileDescriptor parcelFileDescriptor= null; try { parcelFileDescriptor = context.getContentResolver().openFileDescriptor(uri,"r"); } catch (FileNotFoundException e) { e.printStackTrace(); } if(parcelFileDescriptor!=null){ FileDescriptor fileDescriptor=parcelFileDescriptor.getFileDescriptor(); bitmap=BitmapFactory.decodeFileDescriptor(fileDescriptor); } else{ bitmap=BitmapFactory.decodeResource(context.getResources(), R.mipmap.music_album); } return bitmap; }
OK,畅想音乐播放器第一版就结束了,后续还会有更复杂的版本,大约两周的时间更新一个大版本,请继续关注该博客。
需要源码的请加qq 2372126585 或者发送邮件到该QQ的邮箱,互相学习。
0 0
- Android播放器的制作---畅想音乐播放器
- 畅想音乐播放器第二版
- 音乐播放器的制作
- Android音乐播放器的播放实例
- 制作一个简单的Android版的音乐播放器
- 浅谈音乐播放器的制作心得
- unity 音乐播放器的制作
- 基于arm的音乐播放器制作
- js制作简单的音乐播放器
- android音乐播放器播放音乐卡
- Android 音乐播放 类似音乐播放器
- 单片机音乐播放器制作
- Silverlight制作音乐播放器
- Silverlight制作音乐播放器
- android 音乐播放器
- Android 音乐播放器
- android 音乐播放器
- Android音乐播放器
- [CS231N课程笔记] Lecture 2. Image Classification
- 使用EL表达式需要注意的
- (p124)k分位数
- (3) linux shell 命令 -- pwd
- Epoll使用示例
- Android播放器的制作---畅想音乐播放器
- 更新Win10后genymotion启动失败的解决方法
- ssmmaven 配置文件
- Excel单元格边框斜线的使用
- Java描述贪心算法求解单元点最短路径问题
- [计算几何笔记3]最小圆覆盖
- ubuntu apache laravel5.2 中.htaccess路由跳转无效
- Java 键盘上各个按键的KeyCode值
- 从头认识Spring-2.5 @Autowire @Inject @Qualifier @Named的相同与不同