播放音乐逻辑
- mediaplayer 播放音频和视频
try { String path = Environment.getExternalStorageDirectory().getPath(); Log.e(TAG, "palysMusic: " + path+"/data/xpg.mp3"); mediaPlayer.setDataSource(path + "/data/xpg.mp3"); mediaPlayer.prepare(); mediaPlayer.start(); updateseekbar(); } catch (IOException e) { Log.e(TAG, "palysMusic: "+e.getLocalizedMessage().toString() ); e.printStackTrace(); }
- 完善百度音乐盒,为了提升音乐播放器案例进程优先级,所以我们把播放的逻辑写到服务里
- 完善UI 加上一个进度条 代表播放歌曲的进度
<?xml version="1.0" encoding="utf-8"?> <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" tools:context=".MainActivity"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="start" android:text="播放" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="pause" android:text="暂停" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="restart" android:text="继续" /> <SeekBar android:id="@+id/seekbar" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="net" android:text="播放网络音乐" /> </LinearLayout>
-
- 实现播放歌曲 暂停 继续播放的逻辑
public void palysMusic() { try { String path = Environment.getExternalStorageDirectory().getPath(); Log.e(TAG, "palysMusic: " + path+"/data/xpg.mp3"); mediaPlayer.setDataSource(path + "/data/xpg.mp3"); mediaPlayer.prepare(); mediaPlayer.start(); updateseekbar(); } catch (IOException e) { Log.e(TAG, "palysMusic: "+e.getLocalizedMessage().toString() ); e.printStackTrace(); } }
-
- 暂停歌曲
public void pausesMusic() { Log.e(TAG, "pausesMusic: " ); mediaPlayer.pause(); }
-
-
- 继续播放歌曲
-
public void continueMusic() { Log.e(TAG, "continueMusic: " ); mediaPlayer.start(); }
-
- 实现更新进度条的逻辑:
private void updateseekbar() { final Timer timer = new Timer(); TimerTask timerTask = new TimerTask() { @Override public void run() { int duration = mediaPlayer.getDuration(); int currentPosition = mediaPlayer.getCurrentPosition(); Message msg = Message.obtain(); Bundle bundle = new Bundle(); bundle.putInt("all", duration); bundle.putInt("current", currentPosition); msg.setData(bundle); MainActivity.handler.sendMessage(msg); } }; timer.schedule(timerTask, 1000, 1000); mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { timer.cancel(); } }); }
@SuppressLint("HandlerLeak") public static Handler handler = new Handler() { @Override public void handleMessage(Message msg) { Bundle bundle = msg.getData(); int all = bundle.getInt("all"); int current = bundle.getInt("current"); seekbar.setMax(all); seekbar.setProgress(current); super.handleMessage(msg); } };
-
- 实现拖拽进度条,播放歌曲指定位置.首先在服务内部暴漏一个方法,用来播放歌曲指定位置.
public void palyPosition(int position) { mediaPlayer.seekTo(position); }
-
- 给进度条设置一个监听 当拖动停止的时候播放歌曲的指定位置:
seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { iservice.playPosition(seekbar.getProgress()); } }); }
-
- 当歌曲播放完成了 取消tiemr(计时器)
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { timer.cancel(); } });
- 播放网络音频代码
public void net(View view) { Log.e(TAG, "net: "); new Thread(new Runnable() { @Override public void run() { try { MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource("http://47.105.71.243:8080/resource/xpg.mp3"); mediaPlayer.prepareAsync(); mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { Log.e(TAG, "onPrepared: "); mp.start(); } }); } catch (IOException e) { e.printStackTrace(); } } }).start();