日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > 手把手教你做音樂播放器(二)技術原理與框架設計

手把手教你做音樂播放器(二)技術原理與框架設計

來源:程序員人生   發布時間:2016-09-27 08:39:20 閱讀次數:3837次

第2節 技術原理與框架設計

在開始正式開發功能之前,我們需要對要完成的功能做1個技術驗證,確保有足夠的能力和技術積累能完成它。

以后再根據調查的結果,設計程序的結構。這就好比造房子之前要計劃好藍圖,不然房子極可能造著造著就暴露出很多沒有想到的問題。

2.1 播放音樂

安卓系統作為1個利用開發的框架,為我們提供了豐富的工具,包括了音樂播放支持,很多格式的音樂都能播放。正因如此,我們才不需要從第1行代碼開始去研究各種音頻格式,不用去斟酌2進制格式的音頻文件該如何解包、如何解碼等等。

只需要告知系統,我有1個音頻文件,要交給你播放,怎樣播放的我不管,你全權負責,只需要把播放時的狀態向我報告就行了。

安卓系統提供的組件MediaPlayer就可以實現音頻文件的播放,我們只需要遵守以下的步驟,

  1. 創建1個MediaPlayer對象,

    MediaPlayer mMusicPlayer = new MediaPlayer();
  2. MediaPlayer設置要播放的文件,可以是文件的物理地址,也能夠是文件的Uri地址,

    mMusicPlayer.setDataSource(context, songUri);
  3. 設置完成參數,準備播放,

    mMusicPlayer.prepare();
  4. 播放、暫停、停止播放,

    //開始播放 mMusicPlayer.start(); //暫停播放 mMusicPlayer.pause(); //停止播放 mMusicPlayer.stop(); //重置播放器 mMusicPlayer.reset(); //跳轉到特定時間 mMusicPlayer.seekTo();
  5. 通過設置監聽器,獲得播放器返回的各種播放狀態,

    //注冊監聽器,監聽音樂是不是播放完成 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個地址就行了,我們會在后面的章節做詳細的介紹。

2.2 播放列表的存儲

播放列表需要能長時間的存儲起來,即便程序退出了,下次啟動的時候也能得到上次等待播放的音樂任務。

這里我們將正在播放的音樂列表存儲到安卓系統提供的SQLite數據庫中。

這個數據庫可以被要獲得它保存的數據的組件直接使用,也能夠被封裝在自定義的ContentProvider當中,讓他人通過查詢ContentProvider來間接使用。

ContentProvider是安卓開發中很重要的組件之1,可以向其他組件提供數據訪問的能力。它就像是1個網站,其他組件(或其他利用)可以通過“網址”訪問它,獲得需要的信息。因此它可以作為不同利用之間同享數據的1種方式。

以后很多利用的開發可能都會與它打交道,都需要我們自定義1個適合的ContentProvider。所以我們就借此機會來學習如何自定義1個ContentProvider吧。

自定義1個ContentProvider,需要

  1. 繼承ContentProvider類重新創建1個類,并實現其中的1些方法;
  2. 在利用的AndroidManifest.xml文件中,聲明這個新添加的組件;

在這里,我們將利用它來存儲播放列表。

2.3 Service組件

啟動主界面的Activity,在該Activity中創建MediaPlayer,讓它來播放音樂看起來是可以的,不過這類設計有個很嚴重的問題-音樂不能在后臺播放,也就是說你不能1邊聽音樂,1邊刷微博。

緣由很簡單,當前的程序結構將系統的MediaPlayer與播放器的主界面Activity關聯在1起。當主界面的Activity被用戶按下了返回鍵時,它會被系統燒毀。邏輯上講,主界面Activity所包括的MediaPlayer也就應當與世長辭了,怎樣還能讓它來繼續播放音樂呢?!

所以在此,我們需要1個能夠在主界面Activity退出以后,還能保證讓MediaPlayer繼續工作的方案。這個問題的解決方案,將有安卓系統的另外一個重要組件Service提供。

Service就像是個不需要界面顯示的Activity(雖然不太嚴謹,但大體上可以這樣想象,幫助我們理解新的概念),它運行在系統的后臺,當系統資源不足需要進行強行的資源回收時,回收優先級也比那些沒有顯示出來的Activity低,正是我們用來拜托播放音樂最好的組件。

2.4 桌面小工具

桌面小工具的實現,由安卓系統給出了專門的設計方案。

桌面小工具是安卓系統桌面框架的1部份,不需要我們挖空心思從頭設計,只要依照它的設計規則來開發就能夠了。

在項目工程上點擊右鍵,選擇new->Wideget->App Widget就為我們創建好了開發用的模版,非常的簡單方便。

2.5 程序框架

基于上面的分析,我們將全部利用的框架做了大致的梳理,

  1. 主界面ActivityMusicListActivity:展現音樂列表,當前播放進度;它與播放服務建立聯系,獲得播放列表和播放控制接口;

  2. 播放列表記錄存儲模塊-PlayListContentProvider:記錄當前的播放列表;提供給播放服務使用;

  3. 播放服務-MusicService:對外,為主界面MusicListActivity提供控制音樂播放、操作播放列表的接口;對內從PlayListContentProvider獲得播放列表的操作,具有MediaPlayer對象,實際的控制播放器;

  4. 桌面小工具-AnddleMusicAppWidget:與MusicService聯系,提供主界面上快速控制音樂播放流程的便捷方式;

第2節 技術原理與框架設計

在開始正式開發功能之前,我們需要對要完成的功能做1個技術驗證,確保有足夠的能力和技術積累能完成它。

以后再根據調查的結果,設計程序的結構。這就好比造房子之前要計劃好藍圖,不然房子極可能造著造著就暴露出很多沒有想到的問題。

2.1 播放音樂

安卓系統作為1個利用開發的框架,為我們提供了豐富的工具,包括了音樂播放支持,很多格式的音樂都能播放。正因如此,我們才不需要從第1行代碼開始去研究各種音頻格式,不用去斟酌2進制格式的音頻文件該如何解包、如何解碼等等。

只需要告知系統,我有1個音頻文件,要交給你播放,怎樣播放的我不管,你全權負責,只需要把播放時的狀態向我報告就行了。

安卓系統提供的組件MediaPlayer就可以實現音頻文件的播放,我們只需要遵守以下的步驟,

  1. 創建1個MediaPlayer對象,

    MediaPlayer mMusicPlayer = new MediaPlayer();
  2. MediaPlayer設置要播放的文件,可以是文件的物理地址,也能夠是文件的Uri地址,

    mMusicPlayer.setDataSource(context, songUri);
  3. 設置完成參數,準備播放,

    mMusicPlayer.prepare();
  4. 播放、暫停、停止播放,

    //開始播放 mMusicPlayer.start(); //暫停播放 mMusicPlayer.pause(); //停止播放 mMusicPlayer.stop(); //重置播放器 mMusicPlayer.reset(); //跳轉到特定時間 mMusicPlayer.seekTo();
  5. 通過設置監聽器,獲得播放器返回的各種播放狀態,

    //注冊監聽器,監聽音樂是不是播放完成 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個地址就行了,我們會在后面的章節做詳細的介紹。

2.2 播放列表的存儲

播放列表需要能長時間的存儲起來,即便程序退出了,下次啟動的時候也能得到上次等待播放的音樂任務。

這里我們將正在播放的音樂列表存儲到安卓系統提供的SQLite數據庫中。

這個數據庫可以被要獲得它保存的數據的組件直接使用,也能夠被封裝在自定義的ContentProvider當中,讓他人通過查詢ContentProvider來間接使用。

ContentProvider是安卓開發中很重要的組件之1,可以向其他組件提供數據訪問的能力。它就像是1個網站,其他組件(或其他利用)可以通過“網址”訪問它,獲得需要的信息。因此它可以作為不同利用之間同享數據的1種方式。

以后很多利用的開發可能都會與它打交道,都需要我們自定義1個適合的ContentProvider。所以我們就借此機會來學習如何自定義1個ContentProvider吧。

自定義1個ContentProvider,需要

  1. 繼承ContentProvider類重新創建1個類,并實現其中的1些方法;
  2. 在利用的AndroidManifest.xml文件中,聲明這個新添加的組件;

在這里,我們將利用它來存儲播放列表。

2.3 Service組件

啟動主界面的Activity,在該Activity中創建MediaPlayer,讓它來播放音樂看起來是可以的,不過這類設計有個很嚴重的問題-音樂不能在后臺播放,也就是說你不能1邊聽音樂,1邊刷微博。

緣由很簡單,當前的程序結構將系統的MediaPlayer與播放器的主界面Activity關聯在1起。當主界面的Activity被用戶按下了返回鍵時,它會被系統燒毀。邏輯上講,主界面Activity所包括的MediaPlayer也就應當與世長辭了,怎樣還能讓它來繼續播放音樂呢?!

所以在此,我們需要1個能夠在主界面Activity退出以后,還能保證讓MediaPlayer繼續工作的方案。這個問題的解決方案,將有安卓系統的另外一個重要組件Service提供。

Service就像是個不需要界面顯示的Activity(雖然不太嚴謹,但大體上可以這樣想象,幫助我們理解新的概念),它運行在系統的后臺,當系統資源不足需要進行強行的資源回收時,回收優先級也比那些沒有顯示出來的Activity低,正是我們用來拜托播放音樂最好的組件。

2.4 桌面小工具

桌面小工具的實現,由安卓系統給出了專門的設計方案。

桌面小工具是安卓系統桌面框架的1部份,不需要我們挖空心思從頭設計,只要依照它的設計規則來開發就能夠了。

在項目工程上點擊右鍵,選擇new->Wideget->App Widget就為我們創建好了開發用的模版,非常的簡單方便。

2.5 程序框架

基于上面的分析,我們將全部利用的框架做了大致的梳理,

  1. 主界面ActivityMusicListActivity:展現音樂列表,當前播放進度;它與播放服務建立聯系,獲得播放列表和播放控制接口;

  2. 播放列表記錄存儲模塊-PlayListContentProvider:記錄當前的播放列表;提供給播放服務使用;

  3. 播放服務-MusicService:對外,為主界面MusicListActivity提供控制音樂播放、操作播放列表的接口;對內從PlayListContentProvider獲得播放列表的操作,具有MediaPlayer對象,實際的控制播放器;

  4. 桌面小工具-AnddleMusicAppWidget:與MusicService聯系,提供主界面上快速控制音樂播放流程的便捷方式;


/*******************************************************************/
* 版權聲明
* 本教程只在CSDN和安豆網發布,其他網站出現本教程均屬侵權。

*另外,我們還推出了Arduino智能硬件相干的教程,您可以在我們的網店安豆的雜貨鋪中購買相干硬件。同時也感謝大家對我們這些碼農的支持。

*最后再次感謝各位讀者對安豆的支持,謝謝:)
/*******************************************************************/

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 久久精品视频网 | 免费观看高清韩国日本大全 | 综合伊人 | 天天干夜夜操视频 | 色久视频 | 欧美日韩精品一区二区三区蜜桃 | 精品久久久国产 | 免费黄网站在线观看 | 欧美成人精品一区二区三区 | 国产经典一区二区三区 | 欧美日韩免费做爰视频 | www.av一区 | 日韩美一区二区三区 | 国产精品久久久久久久久久 | 国产91精品久久久久久久网曝门 | 成人av在线影院 | 美女视频网址 | 国产精品久久久亚洲 | 综合久久av| www.久久久久 | 久久精品日韩 | 日韩久久久久久 | 欧美日韩在线电影 | 一区二区三区视频在线 | 亚洲欧美日韩在线播放 | 精品视频在线观看一区二区三区 | 天堂аⅴ在线最新版在线 | 中文字幕不卡 | 午夜精品一区二区三区在线播放 | 亚洲国产精品va在线看黑人动漫 | 国产二区三区 | 精品三区 | 欧美日韩亚洲国产 | 不卡视频一区二区三区 | 国产视频一区在线播放 | 日韩免费在线观看视频 | 欧美亚洲一区二区三区 | 欧美一二区 | 最近中文字幕视频大全 | 亚洲视频在线一区 | 国产在线精品一区 |