1. 程式人生 > >Android開發---MediaPlayer簡單音樂播放器

Android開發---MediaPlayer簡單音樂播放器

功能介紹

  • 實現一個簡單的播放器,類似網易雲音樂形式,功能包括:

    1. 播放、暫停,停止,退出功能;
    2. 後臺播放功能;
    3. 進度條顯示播放進度、拖動進度條改變進度功能;
    4. 播放時圖片旋轉,顯示當前播放時間功能;
  • 介面樣式 

功能實現

1. MediaPlayer的實現

  • MediaPlayer常用方法介紹
  •  
    MediaPlayer的實現包括初始化MediaPlayer,MediaPlayer的功能實現,包括播放、暫停、停止、離開等,具體細節如下: 
    MediaPlayer的初始化包括讀取一個MP3格式的音樂檔案並設定其為迴圈播放:
public void
initMediaPlayer() { try { //String file_path = "/storage/0123-4567/K.Will-Melt.mp3"; String file_path = Environment.getExternalStorageDirectory().getAbsolutePath()+"/K.Will-Melt.mp3"; //String file_path = "/data/K.Will-Melt.mp3"; mediaPlayer.setDataSource(file_path); mediaPlayer.prepare(); mediaPlayer.setLooping(true
); // 設定迴圈播放 } catch (Exception e) { e.printStackTrace(); } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

播放/暫停功能的實現放在Play/Pause按鈕中,所以需要二選一判斷MediaPlayer的狀態來設定音樂的播放與暫停:

public void playOrPause() {
        flag++;
        if (flag >= 1000) flag = 2;

        which = "pause";

        if
(mediaPlayer.isPlaying()){ mediaPlayer.pause(); animator.pause(); } else { mediaPlayer.start();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

類似的,停止功能的實現放在Stop按鈕中,用於停止音樂並將其置於初始態即“00:00”:

public void stop() {
        which = "stop";
        animator.pause();
        if(mediaPlayer != null) {
            mediaPlayer.pause();
            mediaPlayer.stop();
            try {
                mediaPlayer.prepare();
                mediaPlayer.seekTo(0);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

說明:由於呼叫stop()後,有時音樂並沒有馬上停止,所以我額外加了一個pause()來確保音樂停止播放。

同樣,離開功能實現放在了Quit按鈕中,主要實現整個應用的退出,具體應包括解綁Service,結束Activity等等:

private void quit() {
        musicService.animator.end();
        handler.removeCallbacks(runnable);
        unbindService(sc);
        try {
            finish();
            System.exit(0);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2. Service的應用

  • Service即“服務” ,它與Activity屬於同一等級的應用程式元件,都代表可執行的程式。不同的是Activity擁有前臺執行的使用者介面,而Service不能自己執行,需要通過某個Activity或者其他Context物件來呼叫。Service在後臺執行,它不能與使用者直接進行互動。在預設情況下,Service執行在應用程式程序的主執行緒之中。可以通過Context.startService()和Context.bindService()兩種方式來啟動Service。
  • 通過Service可以使程式在退出之後仍然能夠對事件或使用者操作做出反應,或者在後臺繼續執行某些程式功能。
  • Android賦予Services比處於不活動(inactivity)的Activities更高的優先順序,所以它們的程序不會輕易被系統殺掉。
  • Activity與Service的互動示意圖為: 
    這裡寫圖片描述 
    有了以上知識的積累,基本可以實現Service的必要部分,如下: 
    1.新建一個繼承於Service的MusicService類
public class MusicService extends Service {
    public final IBinder binder = new MyBinder();
    public class MyBinder extends Binder {
        MusicService getService() {
            return MusicService.this;
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
/**
     * onBind 是 Service 的虛方法,因此我們不得不實現它。
     * 返回 null,表示客服端不能建立到此服務的連線。
     */
    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.並在Activity中繫結MusicService:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getOverflowMenu();
        setContentView(R.layout.activity_main);

        bindServiceConnection();
        musicService = new MusicService();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
private ServiceConnection sc = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            musicService = ((MusicService.MyBinder) iBinder).getService();
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            musicService = null;
        }
    };

    private void bindServiceConnection() {
        Intent intent = new Intent(this, MusicService.class);
        startService(intent);
        bindService(intent, sc, this.BIND_AUTO_CREATE);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

3. Handler更新UI介面

通過Handler來管理UI,最要需要用到post和postDelayed兩個函式: 
1. post(Runnable r) 
將r加入到訊息佇列中(其實就是利用UI主執行緒執行一段程式碼,這樣可以隨時在其他執行緒中調整控制元件) 
2. postDelayed(Runnabled r,long delayMillis) 
將r加入到訊息佇列中,並在指定時間之後觸發(單位為毫秒) 
所以,為了實現音樂的播放顯示等功能,需要重寫Runnable的run函式,具體實現如下:

public Handler handler = new Handler();
    public Runnable runnable = new Runnable() {
        @Override
        public void run() {

            isPlay.setOnClickListener(new myOnClickListener());
            stop.setOnClickListener(new myOnClickListener());
            quit.setOnClickListener(new myOnClickListener());

            if(musicService.mediaPlayer.isPlaying()) {
                stateText.setText("Playing");
            } else {
                if (musicService.which.equals("stop"))  {
                    stateText.setText("Stop");
                } else if (musicService.which.equals("pause")){
                    stateText.setText("Pause");
                }
            }
            playingTime.setText(time.format(musicService.mediaPlayer.getCurrentPosition()));
            totalTime.setText(time.format(musicService.mediaPlayer.getDuration()));
            seekBar.setProgress(musicService.mediaPlayer.getCurrentPosition());
            seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                    if (fromUser) {
                        musicService.mediaPlayer.seekTo(seekBar.getProgress());
                    }
                }

                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {

                }

                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {

                }
            });
            handler.postDelayed(runnable, 100);
        }
    };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

4. 實現圖片的旋轉

圖片的動畫效果實現需要用到ObjectAnimator類,ObjectAnimator類可用於圖片的平移、旋轉、縮放等動畫,此處我們只需要用到其旋轉功能,具體實現如下:

public  void AnimatorAction() {
        if (mediaPlayer.isPlaying()) {
            animator.setDuration(5000);
            animator.setInterpolator(new LinearInterpolator()); // 均速旋轉
            animator.setRepeatCount(ValueAnimator.INFINITE); // 無限迴圈
            animator.setRepeatMode(ValueAnimator.INFINITE);
            animator.start();
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

說明:animator是ObjectAnimator的一個例項物件,setDuration為5000表示旋轉一週需要的時間為5000,所以可用來設定旋轉的速度;同時設定為無線迴圈模式,並且新增一個插值器達到勻速旋轉的目的,最後呼叫pause()等函式動態控制動畫狀態,如下: 

5. 進度條SeekBar功能實現

SeekBar的功能包括顯示歌曲播放進度以及拖動SeekBar至任意位置來改變播放進度,由於Android已經封裝好了這些函式,所以直接呼叫就好了,也比較好理解,具體實現如下:

seekBar = (SeekBar) findViewById(R.id.seekBar);
        seekBar.setProgress(musicService.mediaPlayer.getCurrentPosition());
        seekBar.setMax(musicService.mediaPlayer.getDuration());
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3
seekBar.setProgress(musicService.mediaPlayer.getCurrentPosition());
            seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                    if (fromUser) {
                        musicService.mediaPlayer.seekTo(seekBar.getProgress());
                    }
                }

                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {

                }

                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {

                }
            });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

6. 動態許可權申請

7. 判斷程式是否處於後臺

由於音樂需要支援後臺播放,再次由後臺進入前臺會對前臺的事件功能等產生影響,所以可以新增一個後臺判斷函式,並新增一個標誌來記錄應用是否進入後臺。

private boolean isApplicationBroughtToBackground() {
        ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
        if (!tasks.isEmpty()) {
            ComponentName topActivity = tasks.get(0).topActivity;
            if (!topActivity.getPackageName().equals(getPackageName())) {
                
            
           

相關推薦

Android開發---MediaPlayer簡單音樂播放

功能介紹 實現一個簡單的播放器,類似網易雲音樂形式,功能包括: 播放、暫停,停止,退出功能;後臺播放功能;進度條顯示播放進度、拖動進度條改變進度功能;播放時圖片旋轉,顯示當前播放時間功能; 介面樣式  功能實現 1.

Android如何實現簡單音樂播放的程式碼

想必大家在學Android的音樂播放器時肯定會遇到很多困難,不怕,在這裡我給大家分享一個很簡單的音樂播放器,絕對會對你的學習有所幫助。本例子不難,但是也確能給你帶來柳暗花明又一村的感覺。閒話少說,馬上來看看這個播放器有

Android開發介面設計---音樂播放介面

採用線性佈局  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" and

Android實現簡單音樂播放(MediaPlayer)

工程內容 實現一個簡單的音樂播放器,要求功能有: 播放、暫停功能;進度條顯示播放進度功能拖動進度條改變進度功能;後臺播放功能;停止功能;退出功能; 程式碼實現 匯入歌曲到手機SD卡的Music目錄中,這裡我匯入了4首歌曲:仙劍六裡面的《誓言成暉》、《劍客不能說》、《鏡

Android開發6:Service的使用(簡單音樂播放的實現)

閱讀目錄前言基礎知識實驗內容實驗過程注意事項實驗截圖原始碼下載注回到頂部前言   啦啦啦~各位好久不見啦~博主最近比較忙,而且最近一次實驗也是剛剛結束~   好了不廢話了,直接進入我們這次的內容~   在這篇博文裡我們將學習Service(服務)的相關知識,學會使用 Service 進行後臺工作, 學會使用

Android簡單音樂播放(十)歌詞的實現

關於歌詞 有下面這些: 歌詞的獲取 歌詞的解析 自定義View 歌詞的獲取 歌詞的獲取分為兩種,一種是從本地一種是通過網路上提供的API獲取。我選擇的是歌詞迷的API http://api.geci.me/en/latest/ 說實話,這

Android Studio:服務與多執行緒--簡單音樂播放

一、 實驗題目   服務與多執行緒--簡單音樂播放器 【目的】 1. 學會使用 MediaPlayer; 2. 學會簡單的多執行緒程式設計,使用 Handle 更新 UI; 3. 學會使用 Service 進行後臺工作; 4. 學會使用 Service 與 Activit

Android簡單音樂播放(七)拖動歌曲進度條~音量控制~

音量控制 通過接收廣播進行改變 設定全域性變數 private AudioManager mAudioManager; private ContentObserver mVoiceObserver; private MyVolum

Android簡單音樂播放(九)搜尋網路歌曲,獲得熱門榜單(GridView)(易源api的使用)(JSON的解析)(重新整理)

首先感謝易源API! 提供了QQ音樂的介面~ 咳咳... 明天要寫文件..看來..哎..我的歌詞要等假期了? 迴歸正題~ 首先上一下我的介面啊實現啊啥的~ 點選榜單會出現對應的歌曲~ 可以搜尋網路歌曲~ 可以重新整理~ 先寫榜單的實現~ 首先是net這個Frag

Mediaplayer實現音樂播放,支援後臺播放

mediaplayer是Android開發中常見的播放音訊檔案的類。這個demo主要實現掃描本地的mp3音訊檔案並支援後臺播放,廢話不多說,直接上程式碼 1,佈局檔案: <?xml version="1.0" encoding="utf-8"?> <LinearLayout

Android應用--簡 美音樂播放獲取專輯圖片(自定義列表介面卡)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

用c# -Winform開發一款音樂播放專案

最近一段時間有時間,就試著用c#-winform寫個音樂播放器的窗體,接著就進行了,我先前在網上收集好素材,另外還看了幾篇有關音樂播放器的專案,整合,融合自己的風格就完成了以下專案.雖然現在功能不多,但是在慢慢完善,如果有人想要看一下原始碼,請聯絡我QQ:1439802478 &n

求助Android進度條在音樂播放中的使用方法

MainAvctivity.java ` package com.example.shinelon.myapplication; import android.app.Activity; import android.content.ComponentName; import and

android 四大元件service 音樂播放的實現

新建立一個Android工程《音樂播放器》,包名:com.itheima.musicPlayer。 在res目錄下新建一個資料夾raw(名字必須為raw,約定大於配置的原則),然後在raw目錄中拷貝進一個音樂檔案,注意檔名必須遵循Android資原始檔的命名

Android 監聽系統音樂播放播放音樂的方法

  最近在做專案的時候遇到一個小問題,就是需要自己寫一個View來控制系統音樂播放器的播放行為,並且要能得到正在播放的音樂的資訊,可能剛開始是想省點時間,所以就沒有直接去看原始碼,而是上網搜尋了一下,但令我十分驚訝的是網上竟然沒有這個,難道說沒有童鞋做過這個?嘿嘿,啥

簡單音樂播放,還有歌詞

不是來說播放器的(前面我有一篇VLC的,可以倒回去看),這篇是來分享 這個顯示歌詞的,還是用了前一篇的PickerView的原理進行放大歌詞 使用知識點 歌詞動態放大

開發一個簡易音樂播放

本人初學Android,最近做了一個實現安卓簡單音樂播放功能的播放器,收穫不少,於是便記錄下來自己的思路與知識總結,重溫自己的探索之路。 1  那麼先上幾張截圖來看下程式實現效果吧 2 可以看出基本實現的功能有 暫停(播放),上(下)一首,停止播放

微信小程式 開發簡易情緒音樂播放

時間原因,寫簡單粗暴點(幾年不寫生疏了): 一、微信小程式 - 微信web開發工具 下載 二、新建專案 具體教程詳見: 微信小程式API 三、這裡直接更改index包下資源 :  第一步 UI 繪製  修改index.wxml + index.wxss 第二部 JS 控制

android----極其簡易的音樂播放(service的使用)

俱樂部的作業已經拖了一週了,實在不好意思再不弄了。。。前天晚上開了個頭,總是因為資源太大執行不了,導致一直沒法繼續編下去。。今天偶然發現居然刪掉了之前工程裡的音樂資源就又能加進去一個音樂了~為了避免再次執行不了,我就加了兩個音樂,來回切換,也算能夠完成基本要求啦~表示資源太

Swift 3 :基於 AVAudioPlayer 的簡單音樂播放

vat content 控制器 ets 而已 rand init pla pause 2017.05.22 17:46* 字數 1585 閱讀 5095評論 0喜歡 8贊賞 2 https://www.jianshu.com/p/4d5c257428a1 學習ios以來差不