怎样用Android开发音乐播放器
最近开始学习音频相关。所以,很想自己做一个音乐播放器,于是,花了一天学习,将播放器的基本功能实现了出来。
操作方法
- 01
在市面上的音乐播放app,即时你关了。那么一样会在后台播放,所以播放的逻辑应该写在Service中。并且能够实现Service和Activity之间进行通信。那么Service是四大组件之一,所以在使用的时候一定不要忘了在配置文件中声明一下。 <service android:name="com.yakir.services.MusicService"> </service> 我们需要重写Service中的三个方法, onCreate(),onStartCommand(),onDestroy()。 onCreate():Service 第一次启动的时候调用这个方法,可以做一些变量的初始化。 onStartCommand():Service 每一次启动的时候调用这个方法,可以在此方法写一些业务逻辑。 onDestroy():Service 销毁的时候调用,用于释放资源。
- 02
接下来,如果需要播放一个音乐文件,可以使用安卓自带的播放器MediaPlayer,将播放逻辑封装起来。
- 03
我们知道,UI是写在Activity中的,那么就涉及到Activity与Service之间进行通信,他们之间通信的方式有5种,这里我是用了Intent,调用startService()进行通信, 同时让Intent携带一组键值对数据,与Service端进行匹配。
- 04
我们需要设置Service: Override public int onStartCommand(Intent intent, int flags, int startId) { Log.e("thread",Thread.currentThread().getName() ); String option=intent.getStringExtra("option"); if (messenger==null) { messenger = (Messenger) intent.getExtras().get("messenger"); } if ("开始".equals(option)) { start(intent.getStringExtra("path")); } else if ("暂停".equals(option)) { pause(); } else if ("继续".equals(option)) { continuePlay(); } else if ("停止".equals(option)) { stop(); } else if ("跳转".equals(option)) { seekPlay(intent.getIntExtra("progress",-1)); } return super.onStartCommand(intent, flags, startId); }
- 05
这样,就实现了两者之间的通信,接下来,当我点击下一首的时候,那么下一个item的文字高亮,并且播放下一首歌。我们还要先从系统中拿到所有的音频数据。 public static void getSongList (Context context) { musicBeanList.clear(); Uri uri= MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; Cursor cursor=context.getContentResolver().query(uri, new String[]{ MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.DATA},null,null,null); while (cursor.moveToNext()) { musicBeanList.add(new MusicBean( cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)), cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)), cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)))); } }
- 06
通过内容提供者,拿到系统的所有音频数据,以及音频的相关信息。DATA就是音频路径,拿到音频路径后就可以根据现实位置进行播放切换了。我们需要知道当前的item位置和下一个item位置,当点击下一首歌曲,下个位置高亮,其他位置不亮。所以,需要我们定义一个常量记录当前位置,并且,当点击下一首,常量增加,上一首,常量减少。
- 07
接下来,需要实现一个更随音乐播放进度的进度条,这就需要实现Service向Activity的通信,可以通过消息机制,让Service发送消息给Activity,将播放信息传递给Activity.拿着这个Intent传一个信使(Messager).在SeekBar中设置监听,当拖动停止时把当前进度传给Service,让音乐就当前位置播放。同时,我们需要注意到一个情况,当启动电话时,音乐应该是停止状态,可以通过AudioManager获得音频焦点,当焦点失去时,音乐也应该停止。
- 08
好了,这样一个简单的音乐播放器就完成了,虽然说代码不是很困难,但是还是有很多知识点,比如Activity中Service中的通信,以及ListView相关,还有程序的逻辑性,所以大家一定要多加努力!