日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用MediaPlayer做个带进度条可后台的音乐播放器

發(fā)布時間:2025/7/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用MediaPlayer做个带进度条可后台的音乐播放器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

傳送到github看源碼
下載apk試用 密碼:rukn


前言

  • 想在天朝聽音樂還是有些難度的, 一般來說, 兩三個app還是要的. 那何不嘗試自己做個手機播放器, 聽個爽呢?!今天就帶大家先做個簡單的帶進度條可拖動的音樂播放器.
  • 添加了后臺播放的功能, 很實用哦~

先看效果圖

很尷尬的一點就是大家沒法聽到音樂, 就只能看看圖片.

效果圖

布局文件

布局文件

添加Service

我們需要先把Service添加進來, 再考慮使用MediaPlayer播放, 我們分步來說.

  • 首先要有一個自定義接口, 這個接口中的方法都是要在服務中實現(xiàn)的, 然后要到Activity中使用的.
public interface IService {//1. 定義接口IService, 添加調用函數(shù), 調用MusicService中對應的函數(shù)public void callPlayMusic(String path);public void callPauseMusic();public void callConMusic();public void callSeekToPos(int pos); }
  • 然后來看Service中的實現(xiàn), 自定義一個類, 繼承Binder, 然后實現(xiàn)我們再接口中定義的方法.
/*** 類MyBinder繼承Binder實現(xiàn)接口IService*/private class MyBinder extends Binder implements IService {//2. 定義類MyBinder繼承Binder實現(xiàn)接口IService中的函數(shù)@Overridepublic void callPlayMusic(String path) {playMusic(path);}@Overridepublic void callPauseMusic() {pauseMusic();}@Overridepublic void callConMusic() {conMusic();}@Overridepublic void callSeekToPos(int pos) {seekToPos(pos);}}
  • 具體的實現(xiàn)就要涉及到MediaPlayer的使用了, 我們等下說, 先把Service綁定到Activity. 首先要返回一個自定義類的實例.
@Nullable@Overridepublic IBinder onBind(Intent intent) {//3. 返回自定義類MyBinder對象return new MyBinder();}
  • 然后我們轉到Activity來綁定服務
//4. 開啟服務Intent intent = new Intent(this, MusicService.class);startService(intent);//7. 綁定服務MyConn myConn = new MyConn();bindService(intent, myConn, BIND_AUTO_CREATE);
  • 中間的MyConn又是一個自定義的類, 我們來看下實現(xiàn). 之中要獲取下IService對象, 以此調用定義的函數(shù).
private class MyConn implements ServiceConnection {//5. 定義類MyConn實現(xiàn)接口ServiceConnection@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {//6. 獲取IBinder對象, 以此調用暴露的函數(shù)iService = (IService) service;}@Overridepublic void onServiceDisconnected(ComponentName name) {}}

MediaPlayer的使用

然后服務就完成一個綁定了, 之后我們來說下MediaPlayer和SeekBar的使用. 無非就是播放, 暫停, 繼續(xù)這些的實現(xiàn). 具體的說明請移步官方文檔

/*** 播放音樂** @param path 播放文件的路徑*/public void playMusic(String path) {Log.i(TAG, "playMusic");try {mediaPlayer.reset();mediaPlayer.setDataSource(path);mediaPlayer.setLooping(true);mediaPlayer.prepare();mediaPlayer.start();updateSeekBar();} catch (Exception e) {e.printStackTrace();}}/*** 暫停播放音樂*/public void pauseMusic() {Log.i(TAG, "pauseMusic");if (mediaPlayer.isPlaying()) {mediaPlayer.pause();}}/*** 繼續(xù)播放音樂*/public void conMusic() {Log.i(TAG, "conMusic");mediaPlayer.start();}

讀取文件系統(tǒng)肯定是要權限的, 可以查看我之前的文章一個Util帶你獲取Android6.0以上的讀寫sdcard權限


進度條的設置

SeekBar這里用起來其實不難, 難就難在要從Service傳數(shù)據(jù)到Activity. 這里我選用Handler, 當然你也可以用其它辦法. 同樣我們分步來說.

  • 之前調用mediaPlayer.start();之后我調用了一個updateSeekBar();, 現(xiàn)在來看看實現(xiàn). 關鍵是要獲取到音樂的總長度, 并且實時更新, 要實時更新的話, 我這里開了一個線程, 1s刷一次, 就不多說了.
/*** 更新SeekBar*/private void updateSeekBar() {//獲取總時長final int duration = mediaPlayer.getDuration();//開啟線程發(fā)送數(shù)據(jù)new Thread() {@Overridepublic void run() {while (keepTrue) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}int currentPosition = mediaPlayer.getCurrentPosition();//發(fā)送數(shù)據(jù)給activityMessage message = Message.obtain();Bundle bundle = new Bundle();bundle.putInt("duration", duration);bundle.putInt("currentPosition", currentPosition);message.setData(bundle);MainActivity.handler.sendMessage(message);}}}.start();}
  • 然后回到Activity要接收發(fā)送的message. 接收到之后也完成的差不多了. 然后就是一個SeekBar的監(jiān)聽設置.
public static Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {Bundle data = msg.getData();int duration = data.getInt("duration");int currentPosition = data.getInt("currentPosition");sb_progress.setMax(duration);sb_progress.setProgress(currentPosition);}};
  • 就是在放開拖動SeekBar的時候重新設置位置, 要注意的是, 函數(shù)seekToPos也是在Service中實現(xiàn)的.
//8. 設置進度條拖動事件sb_progress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {iService.callSeekToPos(seekBar.getProgress());}}); /*** 設置SeekBar位置** @param pos 當前位置*/public void seekToPos(int pos) {mediaPlayer.seekTo(pos);}

這樣就完成啦! 喜歡就趕緊下載試試吧! 有意見或者建議也可以評論區(qū)哦.


傳送到github看源碼
下載apk試用 密碼:rukn


《新程序員》:云原生和全面數(shù)字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的用MediaPlayer做个带进度条可后台的音乐播放器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。