1. 程式人生 > >Android使用MediaPlayer播放音樂檔案

Android使用MediaPlayer播放音樂檔案

這裡主要介紹的是SeekBar拖動條和MediaPlayer播放器;

最近專案新增一個音樂播放頁面,讓使用者可以試聽警報聲,所以實現單曲播放,但是隻要單曲可以實現,多曲也非常簡單;

首先看下佈局檔案,在這隻複製SeekBar:(其他的佈局檔案太簡單了,如果想看可以下載demo)

            <!--
            android:max="100"           設定最大進度
            android:progress="0"        設定當前進度
            android:secondaryProgress="":設定第二進度
            android:thumb="":           設定滑動按鈕的圖片
            android:progressDrawable="":進度條背景圖片
            -->
            <SeekBar
                android:id="@+id/seekbar"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_gravity="center_vertical"
                android:layout_weight="1"
                android:max="100"
                android:padding="10dp"
                android:progress="0"
                android:progressDrawable="@drawable/po_seekbar"
                android:thumb="@mipmap/img_point_seekbar" />
SeekBar的背景圖片需要自己建立,在drawable資料夾下建立po_seekbar.xml檔案:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <!--進度條北京-->
    <item android:id="@android:id/background">
        <shape>
            <solid android:color="#c3c9d4" />
        </shape>
    </item>
    <!--緩衝背景顏色,沒有用到(如果網路載入視訊檔案可以用到)-->
    <item android:id="@android:id/secondaryProgress">
        <clip>
            <shape>
                <solid android:color="#ff0000" />
            </shape>
        </clip>
    </item>
    <!--已載入的背景顏色-->
    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <solid android:color="#34b282" />
            </shape>
        </clip>
    </item>

</layer-list>
當用戶點選報警鈴聲跳轉此頁面,會直接播放音樂;

播放音樂非常簡單,按照官方要求初始化MediaPlayer即可:

MediaPlayer mediaPlayer = new MediaPlayer();
        //音樂播放完成的監聽
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                //真實專案中可根據需求更改
            }
        });
//第一步:重置
            mediaPlayer.reset();
            //第二步:設定資料來源(這裡播放的是本地檔案,可播放其他檔案)
            mediaPlayer.setDataSource(activity, musicUri);
            //第三步:準備
            mediaPlayer.prepare();
            //第四步:播放
            mediaPlayer.start();
開始播放以後我們根據MediaPlayer不停的獲取音樂總時長和當前進度設定在指定view上:
// 獲取當前播放的音樂的總時長,當前進度
                int duration = mediaPlayer.getDuration();
                int currentPosition = mediaPlayer.getCurrentPosition();
正在播放的時候如果使用者點選開關需要暫停播放音樂:
//暫停
    private void pause() {
        if (mediaPlayer != null && mediaPlayer.isPlaying())
            //暫停
            mediaPlayer.pause();
        //停止timer
        if (timer != null) {
            timer.cancel();
            timer = null;
        }
    }
使用者再次點選開關需要繼續播放音樂:
    //繼續播放
    private void continuePlay() {
        if (mediaPlayer != null)
            // start();播放、繼續播放
            mediaPlayer.start();
        //繼續播放,重新開啟timer
        getProgressByTimer();
    }
再次點選暫停;

實現拖拽播放:

首先給SeekBar設定拖拽監聽:

//設定進度改變監聽
        mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            //進度改變回調
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {}

            //開始拖拽回撥
            public void onStartTrackingTouch(SeekBar seekBar) {}

            //停止拖拽回撥
            public void onStopTrackingTouch(SeekBar seekBar) {
                //獲取當前拖拽的位置
                int dragedProgress = seekBar.getProgress();
                //記錄拖拽的位置
                Constants.CURRENT_PROGRESS=dragedProgress;  
                musicUtils.start();
            }
        });
當停止拖拽時記錄拖拽的位置,MediaPlayer可根據拖拽位置播放;
    //拖拽
    private void dragPlay() {
        if (mediaPlayer != null) {
            //播放指定位置
            mediaPlayer.seekTo(Constants.CURRENT_PROGRESS);
        }
    }

我們這裡只是為了讓使用者試聽報警音樂,所以並沒有過多的邏輯,但是MediaPlayer主要的功能方法都用到了;