音乐播放器1.5.1准备工作An droid官方提供了 MediaPlayer核心类,用于播放音乐,其状态流程如图 1-12所示MediaPlayer必须严格按照状态图操作,否那么就会出现错误,这些错误都是底层抛出,严格按照状态图操作的话一般就 不会出问题使用MediaPlayer播放音乐的核心方法如下所示:1. MediaPlayer player = new MediaPlayer(); 创立对象Zplayer.resetO; 重置为初始状态3. player.setAudioStreamType(AudioManager.STREAM_MUSIC)声音流类型4.player.setDataSource(“ /mnt/sdcard/test.m设置音频源"5.player.prepare();准备6.player.start();开场或恢复播放7.player.pause();暂停播放8.player.start();恢复播放9.player.stop();停顿播放10.player.release();释放资源为了演示 MediaPlayer的使用,我们需要提前准备一个 mp3文件放到sdcard中。
需求:制作一个播放器,能够播放 /暂停/停顿音乐文件,并且添加一个 SeekBar〔可以拖拽的ProgressBa〕,当音乐播放时 SeekBar也会不断的跟新当前的进度,当用户拖动 SeekBar时可以更改播放的进度23letDaiajcutrceOprep n ejPfrparjdn^rtOprefareAfyncOprep ar? i^tiirtcdepkTsQj'staillSteppedreteaseQ“Lcojun^ true AA-phyb^ck Conlpktes^art0 pafuieQsetkTc:'i.'pau5fiiisrtQ(note SpmbcivsU)Laopcng= bht && otlComplefeJn > invoke-d on \ OnCtjmpletionljiteD er\ ~J^>fcjeekTeO^1 JtckC ompleie i ”图1-12 MediaPlayer状态流程图1.5.2编写布局【文件 1-7】 activity_mai n.xml1. 5.5. 11.vButton12. android:onClick="play"13. android:layout_width="Odp"14. android:layout_weight='T15.android:layout_height="wrap_content'16.android:text="播放"17./>18.vButton19.android:onClick="pause"20.android:layout_width="0dp"21.android:layout_weight="1"22.android:layout_height="wrap_content'23.android:text="暂停"24./>25.vButton26.android:onClick="stop"27. android:layout_width="0dp"28. android:layout_weight='T29. android:layout_height="wrap_content"30. android:text="停顿"31. />32.32. 34.35. vSeekBar36. android:layout_width="match_parent"37. android:layout_height="wrap_content"38.android:id="+id/sb"39./>40.1.5.3代码实现【文件 1-8】 Mai nActivity.java4-mport java.util.TimerTask;5-mport android.media.AudioManagei■;6-mport android.media.MediaPlayer;257. iimportandroid.os.Bundle.view.View;8.9.mport android.widget.SeekBar;10.import android.widget.SeekBar.OnSeekBarChangeListener;11.import android.widget.Toast;12.import android.app.Activity;13./**14.*实现音乐播放器15.16.* author wzy2016-1-2817.18.*/19.public class MainActivity extends Activityimplements OnSeekBarChangeListener {20.21.private SeekBar sb;22.23.privatent duration;private MediaPlayer player;24.31.Override32.protected voidonCreate(Bundle savedlnstanceState){33.super.onCreate(savedlnstanceState);34.setContentView(R .l ayout.activity_main);35.sb = (SeekBar) findViewByld(R.id.sb);36.//设置拖动监听private static final intPLAYING =private static final intPAUSING =private static final intSTOPPING =private volatile int CURRENT =private Timer timer;//播放器的几个状态1;//播放状态25.2;//暂停状态26.3;//停顿状态27.0;//当前状态28.29.30.37.39./**sb.setOnSeekBarChangeListener(this);38.40.播放41. */42.public void play(View view){43.if (player!=null) {44.if (CURRENT==PLAYING) {45.46.Toast.makeText(this,"音乐已经在播放了 ", Toast.LENGTH_SHORT).show(); return;-47.}else if (CURRENT==PAUSING) {48.player.start();49.CURRENT = PLAYING;50.return;2653. try {55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.87.88.89.90.91.54. //创立一个播放器对象player = new MediaPlayer();//给播放器设置音乐路径player.setDataSource("/mnt/sdcard/test.mp3");//设置音乐格式player.setAudioStreamType(AudioManager.STREAM_MUSIC);//准备player.prepare();//获取音乐最大长度〔毫秒单位〕duration = player.getDuration();//给SeekBar设置最大值sb.setMax(duration);//音乐开场播放player.start();//设置当前的状态为播放CURRENT = PLAYING;if (timer==null) {//创立定时器timer = new Timer();} /** *参数1:匿名内部类,相当于 Runnable类*参数2:第一次延时多长时间〔毫秒〕后执行, 0那么代表立即执行*参数3:每隔多长时间(毫秒)执行一次*/timer.schedule(new TimerTask() {81. Override82. public void run() {//该方法每 1秒被调用一次83. if (CURRENT==PLAYING) {84. runOnUiThread(new Runnable() {85.85. Overridepublic void run() {//双重判断,尽可能防止线程问题,因为该段代码时在主线程中的,//第一次判断是在子线程中进展的if (player!=null&&CURRENT==PLAYING) {//获取当前的播放进度92.int currentposition =player.getCurrentPosition();93.//设置给 SeekBar94.sb.setProgress(currentPosition);95.}27"音乐播放失败"+e, O).show();105.106.Toast.makeText(this,}107.108./**109.暂停110.*/111.112.public void pause(View view){null && L CURRENT。