Android Studio完成音樂盒demo

前言

使用Android Studio工具,利用其中的Service和Broadcast機制完成一個音樂盒demo。

附上項目鏈接🎈

基本功能

音樂盒demo實現的功能基本如下:

  1. 播放和暫停
    在正在播放時,點擊播放鍵實現暫停功能,未播放時,點擊播放鍵實現音樂的繼續播放;
  2. 停止
    點擊stop鍵實現停止播放;
  3. 上一首/下一首
    在音樂播放列表中,點擊上一首/下一首實現音樂播放順序的轉換;
  4. 顯示效果
    在播放音樂時,有兩個textview顯示正在播放音樂的標題和演唱者名。

開發參考

參考blog: 廣播組件與通知.

項目運行效果截圖

列表中共三首歌,以下的“上一首”/“下一首”均以第一首(會好的)爲基準

  1. 播放音樂
    播放
  2. 下一首
    在這裏插入圖片描述
  3. 上一首(正在播放列表中第一首時,點擊上一首播放列表中最後一首)
    上一首
  4. 暫停播放
    暫停播放
  5. 停止播放
    停止播放

項目核心代碼🔑

  1. BroadcastReceiver
	// 自定義的BroadcastReceiver,負責監聽從Service傳回來的廣播
    public class ActivityReceiver extends BroadcastReceiver
    {
        @Override
        public void onReceive(Context context, Intent intent)
        {
            // 獲取Intent中的update消息,update代表播放狀態
            int update = intent.getIntExtra("update", -1);
            // 獲取Intent中的current消息,current代表當前正在播放的歌曲
            int current = intent.getIntExtra("current", -1);
            if (current >= 0)
            {
                title.setText(titleStrs[current]);
                author.setText(authorStrs[current]);
            }
            switch (update)
            {
                case 0x11:
                    play.setImageResource(R.drawable.play);
                    status = 0x11;
                    break;
                // 控制系統進入播放狀態
                case 0x12:
                    // 播放狀態下設置使用暫停圖標
                    play.setImageResource(R.drawable.pause);
                    // 設置當前狀態
                    status = 0x12;
                    break;
                // 控制系統進入暫停狀態
                case 0x13:
                    // 暫停狀態下設置使用播放圖標
                    play.setImageResource(R.drawable.play);
                    // 設置當前狀態
                    status = 0x13;
                    break;
            }
        }
    }
  1. 點擊事件
@Override
    public void onClick(View source)
    {
        // 創建Intent
        Intent intent = new Intent("org.crazyit.action.CTL_ACTION");
        switch (source.getId())
        {
            // 按下播放/暫停按鈕
            case R.id.play:
                intent.putExtra("control", 1);
                break;
            // 按下停止按鈕
            case R.id.stop:
                intent.putExtra("control", 2);
                break;
            // 按下上一首按鈕
            case R.id.last:
                intent.putExtra("control",3);
                break;
            // 按下下一首按鈕
            case  R.id.next:
                intent.putExtra("control",4);
                break;
        }
        // 發送廣播,將被Service組件中的BroadcastReceiver接收到
        sendBroadcast(intent);
    }
}
  1. 按鈕點擊事件
public void onClick(View v){//點擊響應
        resetimg();
        switch (v.getId()){
            case R.id.id_tab_weixin:
                selectfragment(0);
                break;
            case R.id.id_tab_friend:
                selectfragment(1);
                break;
            case R.id.id_tab_contact:
                selectfragment(2);
                break;
            case R.id.id_tab_settings:
                selectfragment(3);
                break;
            default:
                break;
        }
}
  1. 列表循環播放
 // 創建MediaPlayer
        mPlayer = new MediaPlayer();
// 爲MediaPlayer播放完成事件綁定監聽器,列表循環播放
        mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener()
        {
            @Override
            public void onCompletion(MediaPlayer mp)
            {
                current++;
                if (current >= 3)
                {
                    current = 0;
                }
                //發送廣播通知Activity更改文本框
                Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);
                sendIntent.putExtra("current", current);
                // 發送廣播,將被Activity組件中的BroadcastReceiver接收到
                sendBroadcast(sendIntent);
                // 準備並播放音樂
                prepareAndPlay(musics[current]);
            }
        });
  1. MyReceiver播放控制
public class MyReceiver extends BroadcastReceiver
    {
        @Override
        public void onReceive(final Context context, Intent intent)
        {
            int control = intent.getIntExtra("control",-1);
            switch (control)
            {
                // 播放或暫停
                case 1:
                    // 原來處於沒有播放狀態
                    if (status == 0x11)
                    {
                        // 準備並播放音樂
                        prepareAndPlay(musics[current]);
                        status = 0x12;
                    }
                    // 原來處於播放狀態
                    else if (status == 0x12)
                    {
                        // 暫停
                        mPlayer.pause();
                        // 改變爲暫停狀態
                        status = 0x13;
                    }
                    // 原來處於暫停狀態
                    else if (status == 0x13)
                    {
                        // 播放
                        mPlayer.start();
                        // 改變狀態
                        status = 0x12;
                    }
                    break;
                // 停止聲音
                case 2:
                    // 如果原來正在播放或暫停
                    if (status == 0x12 || status == 0x13)
                    {
                        // 停止播放
                        mPlayer.stop();
                        status = 0x11;
                    }
                    break;
                //上一曲
                case 3:
                    current--;
                    if (current < 0)
                    {
                        current = 2;
                    }
                    // 準備並播放音樂
                    prepareAndPlay(musics[current]);
                    break;
                //下一曲
                case 4:
                    current++;
                    if (current >= 3)
                    {
                        current = 0;
                    }
                    // 準備並播放音樂
                    prepareAndPlay(musics[current]);
                    break;
            }
            // 廣播通知Activity更改圖標、文本框
            Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);
            sendIntent.putExtra("update", status);
            sendIntent.putExtra("current", current);
            // 發送廣播,將被Activity組件中的BroadcastReceiver接收到
            sendBroadcast(sendIntent);
        }
    }

附上項目鏈接🎈

項目總結✔

本次項目是在一個已有的項目基礎上增加上一首/下一首的控制功能,修改了部分佈局,總體上遇到的問題不多,大致只是在xml文件中做了比較大的修改,assets文件夾中音樂文件做了修改,增加了上一首/下一首的控制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章