在開始正式開發功能之前,我們需要對要完成的功能做1個技術驗證,確保有足夠的能力和技術積累能完成它。
以后再根據調查的結果,設計程序的結構。這就好比造房子之前要計劃好藍圖,不然房子極可能造著造著就暴露出很多沒有想到的問題。
安卓系統作為1個利用開發的框架,為我們提供了豐富的工具,包括了音樂播放支持,很多格式的音樂都能播放。正因如此,我們才不需要從第1行代碼開始去研究各種音頻格式,不用去斟酌2進制格式的音頻文件該如何解包、如何解碼等等。
只需要告知系統,我有1個音頻文件,要交給你播放,怎樣播放的我不管,你全權負責,只需要把播放時的狀態向我報告就行了。
安卓系統提供的組件MediaPlayer
就可以實現音頻文件的播放,我們只需要遵守以下的步驟,
創建1個MediaPlayer
對象,
MediaPlayer mMusicPlayer = new MediaPlayer();
為MediaPlayer
設置要播放的文件,可以是文件的物理地址,也能夠是文件的Uri地址,
mMusicPlayer.setDataSource(context, songUri);
設置完成參數,準備播放,
mMusicPlayer.prepare();
播放、暫停、停止播放,
//開始播放
mMusicPlayer.start();
//暫停播放
mMusicPlayer.pause();
//停止播放
mMusicPlayer.stop();
//重置播放器
mMusicPlayer.reset();
//跳轉到特定時間
mMusicPlayer.seekTo();
通過設置監聽器,獲得播放器返回的各種播放狀態,
//注冊監聽器,監聽音樂是不是播放完成
mMusicPlayer.setOnCompletionListener(mOnCompletionListener);
private MediaPlayer.OnCompletionListener mOnCompletionListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//完成播放后會觸發這里被調用
}
};
//注冊監聽器,監聽音樂是不是播放毛病
mMusicPlayer.setOnErrorListener(null);
例如播放1個Uir地址為content://media/external/audio/media/20422
的音樂,
try {
Uri songUri = Uri.parse("content://media/external/audio/media/20422");
MediaPlayer mMusicPlayer = new MediaPlayer();
mMusicPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//完成播放后會觸發這里被調用
}
});
mMusicPlayer.setDataSource(MusicListActivity.this, songUri);
mMusicPlayer.prepare();
mMusicPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
如果你此時對Uri
其實不熟習,沒有關系,就把它當作文件的1個地址就行了,我們會在后面的章節做詳細的介紹。
播放列表需要能長時間的存儲起來,即便程序退出了,下次啟動的時候也能得到上次等待播放的音樂任務。
這里我們將正在播放的音樂列表存儲到安卓系統提供的SQLite
數據庫中。
這個數據庫可以被要獲得它保存的數據的組件直接使用,也能夠被封裝在自定義的ContentProvider
當中,讓他人通過查詢ContentProvider
來間接使用。
ContentProvider
是安卓開發中很重要的組件之1,可以向其他組件提供數據訪問的能力。它就像是1個網站,其他組件(或其他利用)可以通過“網址”訪問它,獲得需要的信息。因此它可以作為不同利用之間同享數據的1種方式。
以后很多利用的開發可能都會與它打交道,都需要我們自定義1個適合的ContentProvider
。所以我們就借此機會來學習如何自定義1個ContentProvider
吧。
自定義1個ContentProvider
,需要
ContentProvider類
重新創建1個類,并實現其中的1些方法;AndroidManifest.xml
文件中,聲明這個新添加的組件;在這里,我們將利用它來存儲播放列表。
啟動主界面的Activity
,在該Activity
中創建MediaPlayer
,讓它來播放音樂看起來是可以的,不過這類設計有個很嚴重的問題-音樂不能在后臺播放,也就是說你不能1邊聽音樂,1邊刷微博。
緣由很簡單,當前的程序結構將系統的MediaPlayer
與播放器的主界面Activity
關聯在1起。當主界面的Activity
被用戶按下了返回鍵時,它會被系統燒毀。邏輯上講,主界面Activity
所包括的MediaPlayer
也就應當與世長辭了,怎樣還能讓它來繼續播放音樂呢?!
所以在此,我們需要1個能夠在主界面Activity
退出以后,還能保證讓MediaPlayer
繼續工作的方案。這個問題的解決方案,將有安卓系統的另外一個重要組件Service
提供。
Service
就像是個不需要界面顯示的Activity
(雖然不太嚴謹,但大體上可以這樣想象,幫助我們理解新的概念),它運行在系統的后臺,當系統資源不足需要進行強行的資源回收時,回收優先級也比那些沒有顯示出來的Activity低,正是我們用來拜托播放音樂最好的組件。
桌面小工具的實現,由安卓系統給出了專門的設計方案。
桌面小工具是安卓系統桌面框架的1部份,不需要我們挖空心思從頭設計,只要依照它的設計規則來開發就能夠了。
在項目工程上點擊右鍵,選擇new->Wideget->App Widget
就為我們創建好了開發用的模版,非常的簡單方便。
基于上面的分析,我們將全部利用的框架做了大致的梳理,
主界面Activity
-MusicListActivity
:展現音樂列表,當前播放進度;它與播放服務
建立聯系,獲得播放列表和播放控制接口;
播放列表記錄存儲模塊-PlayListContentProvider
:記錄當前的播放列表;提供給播放服務使用;
播放服務-MusicService
:對外,為主界面MusicListActivity
提供控制音樂播放、操作播放列表的接口;對內從PlayListContentProvider
獲得播放列表的操作,具有MediaPlayer
對象,實際的控制播放器;
桌面小工具-AnddleMusicAppWidget
:與MusicService
聯系,提供主界面上快速控制音樂播放流程的便捷方式;
在開始正式開發功能之前,我們需要對要完成的功能做1個技術驗證,確保有足夠的能力和技術積累能完成它。
以后再根據調查的結果,設計程序的結構。這就好比造房子之前要計劃好藍圖,不然房子極可能造著造著就暴露出很多沒有想到的問題。
安卓系統作為1個利用開發的框架,為我們提供了豐富的工具,包括了音樂播放支持,很多格式的音樂都能播放。正因如此,我們才不需要從第1行代碼開始去研究各種音頻格式,不用去斟酌2進制格式的音頻文件該如何解包、如何解碼等等。
只需要告知系統,我有1個音頻文件,要交給你播放,怎樣播放的我不管,你全權負責,只需要把播放時的狀態向我報告就行了。
安卓系統提供的組件MediaPlayer
就可以實現音頻文件的播放,我們只需要遵守以下的步驟,
創建1個MediaPlayer
對象,
MediaPlayer mMusicPlayer = new MediaPlayer();
為MediaPlayer
設置要播放的文件,可以是文件的物理地址,也能夠是文件的Uri地址,
mMusicPlayer.setDataSource(context, songUri);
設置完成參數,準備播放,
mMusicPlayer.prepare();
播放、暫停、停止播放,
//開始播放
mMusicPlayer.start();
//暫停播放
mMusicPlayer.pause();
//停止播放
mMusicPlayer.stop();
//重置播放器
mMusicPlayer.reset();
//跳轉到特定時間
mMusicPlayer.seekTo();
通過設置監聽器,獲得播放器返回的各種播放狀態,
//注冊監聽器,監聽音樂是不是播放完成
mMusicPlayer.setOnCompletionListener(mOnCompletionListener);
private MediaPlayer.OnCompletionListener mOnCompletionListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//完成播放后會觸發這里被調用
}
};
//注冊監聽器,監聽音樂是不是播放毛病
mMusicPlayer.setOnErrorListener(null);
例如播放1個Uir地址為content://media/external/audio/media/20422
的音樂,
try {
Uri songUri = Uri.parse("content://media/external/audio/media/20422");
MediaPlayer mMusicPlayer = new MediaPlayer();
mMusicPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//完成播放后會觸發這里被調用
}
});
mMusicPlayer.setDataSource(MusicListActivity.this, songUri);
mMusicPlayer.prepare();
mMusicPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
如果你此時對Uri
其實不熟習,沒有關系,就把它當作文件的1個地址就行了,我們會在后面的章節做詳細的介紹。
播放列表需要能長時間的存儲起來,即便程序退出了,下次啟動的時候也能得到上次等待播放的音樂任務。
這里我們將正在播放的音樂列表存儲到安卓系統提供的SQLite
數據庫中。
這個數據庫可以被要獲得它保存的數據的組件直接使用,也能夠被封裝在自定義的ContentProvider
當中,讓他人通過查詢ContentProvider
來間接使用。
ContentProvider
是安卓開發中很重要的組件之1,可以向其他組件提供數據訪問的能力。它就像是1個網站,其他組件(或其他利用)可以通過“網址”訪問它,獲得需要的信息。因此它可以作為不同利用之間同享數據的1種方式。
以后很多利用的開發可能都會與它打交道,都需要我們自定義1個適合的ContentProvider
。所以我們就借此機會來學習如何自定義1個ContentProvider
吧。
自定義1個ContentProvider
,需要
ContentProvider類
重新創建1個類,并實現其中的1些方法;AndroidManifest.xml
文件中,聲明這個新添加的組件;在這里,我們將利用它來存儲播放列表。
啟動主界面的Activity
,在該Activity
中創建MediaPlayer
,讓它來播放音樂看起來是可以的,不過這類設計有個很嚴重的問題-音樂不能在后臺播放,也就是說你不能1邊聽音樂,1邊刷微博。
緣由很簡單,當前的程序結構將系統的MediaPlayer
與播放器的主界面Activity
關聯在1起。當主界面的Activity
被用戶按下了返回鍵時,它會被系統燒毀。邏輯上講,主界面Activity
所包括的MediaPlayer
也就應當與世長辭了,怎樣還能讓它來繼續播放音樂呢?!
所以在此,我們需要1個能夠在主界面Activity
退出以后,還能保證讓MediaPlayer
繼續工作的方案。這個問題的解決方案,將有安卓系統的另外一個重要組件Service
提供。
Service
就像是個不需要界面顯示的Activity
(雖然不太嚴謹,但大體上可以這樣想象,幫助我們理解新的概念),它運行在系統的后臺,當系統資源不足需要進行強行的資源回收時,回收優先級也比那些沒有顯示出來的Activity低,正是我們用來拜托播放音樂最好的組件。
桌面小工具的實現,由安卓系統給出了專門的設計方案。
桌面小工具是安卓系統桌面框架的1部份,不需要我們挖空心思從頭設計,只要依照它的設計規則來開發就能夠了。
在項目工程上點擊右鍵,選擇new->Wideget->App Widget
就為我們創建好了開發用的模版,非常的簡單方便。
基于上面的分析,我們將全部利用的框架做了大致的梳理,
主界面Activity
-MusicListActivity
:展現音樂列表,當前播放進度;它與播放服務
建立聯系,獲得播放列表和播放控制接口;
播放列表記錄存儲模塊-PlayListContentProvider
:記錄當前的播放列表;提供給播放服務使用;
播放服務-MusicService
:對外,為主界面MusicListActivity
提供控制音樂播放、操作播放列表的接口;對內從PlayListContentProvider
獲得播放列表的操作,具有MediaPlayer
對象,實際的控制播放器;
桌面小工具-AnddleMusicAppWidget
:與MusicService
聯系,提供主界面上快速控制音樂播放流程的便捷方式;
/*******************************************************************/
* 版權聲明
* 本教程只在CSDN和安豆網發布,其他網站出現本教程均屬侵權。
*另外,我們還推出了Arduino智能硬件相干的教程,您可以在我們的網店安豆的雜貨鋪中購買相干硬件。同時也感謝大家對我們這些碼農的支持。
*最后再次感謝各位讀者對安豆
的支持,謝謝:)
/*******************************************************************/