Android Studio音樂播放器
大三上學期移動應用開發課的作業。有一些粗心的錯誤當時沒有改正過來,而且讀取音樂歌曲的部分程式碼為了趕時間沒有繼續抽象出來成一個函式。以後繼續學java會找機會繼續完善。
---------------------------------------------------------------------------------------------------------------------------------------------
首先介紹這個音樂播放器的大概佈局:安卓有四大元件活動Activity、服務Service、廣播Broadcast、內容提供者Content Provider。這個APP也算是都用到了這幾個元件.
一個服務:musicservice 音樂服務
1、start函式,控制播放或者暫停。 startnew函式,得到一首音樂的地址,播放這一首音樂。
2、開啟另外一個執行緒handle更新主介面的歌曲進度條,傳送一次進度資訊後,執行緒休息一秒鐘,然後繼續傳送下一秒的進度資訊。
3、onStartCommand用來接收活動傳遞過來的資料,根據action做出相應操作
三個活動:
一、mainactivity 主介面
1、上/下一首按鈕。根據在本地曲庫點選後得到的SQL播放列表,查詢列表下一首歌曲的的資訊,傳遞給musicservice的startnew函式一個地址,播放下一首音樂。
2、播放/暫停按鈕,點選後會啟用musicservice的start函式,start函式會判斷,如果是處於播放狀態,切換至暫停,同時圖示更新為暫停的圖示;如果是處於暫停狀態則繼續播放,圖示更新為播放。
3、本地曲庫和播放列表按鈕,進入對應的活動
二、localmusicactivity 本地所有音樂曲目的介面
1、定義一個Music類,裡面包含了歌曲的相關資訊,比如歌曲地址,名字還有歌手以及get方法;
2、findmusic類用來查詢本地音樂資訊,將歌曲傳遞到之前定義的Music型形成一個list<Music>的陣列,並返回這個陣列;
3、MusicAdapter自定義listview介面卡,讓listview顯示全部歌曲。
4、當在本地曲庫點選某一首歌曲的時候,如果這首歌曲播放列表已有,則不新增到播放列表,如果沒有則新增到播放列表。具體操作為將該首歌曲的資訊傳入相應的SQL表格中,SQL表中的資料將作為playlist(播放列表)裡listview歌單的資料顯示出來。
三、playlist播放列表
1、主體結構和localmusicactivity一樣,只不過localmusicactivity是讀取手機的全部音樂,而playlist是讀取自己新建的表格的歌曲。
2、在playlist裡新增有長按彈出選項,刪除功能。也有一個清空播放列表的功能。
訊息傳遞
一、活動傳遞資料到服務
通過ServiceConnection和bindService還有createExplicitFromImplicitIntent這三個方法,活動傳送資料到服務。
1、(呼叫無引數方法)比如音樂服務裡的start方法,活動可以直接進行操作控制暫停或播放。
2、(呼叫有引數方法)對於需要傳遞相關引數的,比如startnew方法裡需要傳入一首歌曲的地址,你需要用到第三個方法createExplicitFromImplicitIntent。首先在活動中新建一個intent(action),傳入extra。startservice(intent)。通過startservice,服務會呼叫 onStartCommand方法來處理傳遞過來的intent,這涉及到服務的生命週期。然後我們在onStartCommand根據之前定義的不同的action,做出處理。對於startnew來說就是 在onStartCommand方法中 得到intent中的music資訊,取出音樂的地址,然後就可以呼叫startnew了。
二、服務傳遞資料到活動
在主活動中註冊了動態廣播(這個廣播除非你退出APP否則是不會退出的,如果在其他兩個活動註冊動態廣播,那麼你從其他兩個活動介面返回主活動介面的時候,動態廣播也被釋放了),來接受來自服務的訊息。
1、(更新標題和歌手)點選一首新的音樂的時候,首頁的歌名和歌手兩個textview必須要接收到資料來更新介面。而且前面說到播放一首新的音樂的時候,必須會呼叫到服務裡的onStartCommand方法,所以我們在onStartCommand裡,startnew播放一首新的音樂之後,還要sendbroadcast,傳送一個廣播到主活動裡,主活動繫結一個相應的過濾器,接收資料更新介面。
2、(更新進度條)主活動第二個更新介面的地方在下方的進度條,因為進度條是隨時更新的。而且不能把更新寫在主執行緒裡。所以在音樂服務裡另外開了一個執行緒handle。每隔一秒鐘傳送一次當前音樂播放到的進度百分比的廣播。然後主介面接收到後更新。
ContentProvider:
localmusicactivity活動裡本地音樂的資訊是怎麼得到的呢?在安卓內部有一個內建表格,不管你通過什麼方式新增進歌曲,這個內建表格都會寫入歌曲的相應資訊。localmusicactivity裡用到了findmusic返回了一個List<Music>,findmusic裡就是查詢到了這個表格,並逐一把歌曲放進數組裡。
Plus Three Points:
一、XML佈局,佈局層層巢狀。
二、在主介面里加入了滑動功能,左滑動右滑動可以進入其他兩個活動介面。
三、自己的手機是Android6.0以上的,6.0以上的版本要求使用本地內容的時候需要動態註冊許可權。
6.0以前的版本是在安裝APP的時候就一口氣彈出一個列表,讓手機使用者把這些許可權給APP。寫程式碼的時候只需要在manifest裡把註冊許可權的程式碼寫好就行。但是6.0以後要求使用到什麼許可權的時候,就彈出什麼請求框要求你把許可權給他,不再像以前一樣一次性許可權全給。