【Android】音樂播放器邊播邊快取(一)AndroidVideoCache的使用方法
最近在做音樂播放器類的需求,做了一段時間,抽出一段時間來整理一下。
【前言】
首先,記錄一下如何找到我們與需求相關的開源庫。可以在GitHub上進行搜尋,我的主要需求是邊播邊快取。因此我在GitHub上搜索“android”“cache”等關鍵詞,搜到了這個 AndroidVideoCache,很好用。
【使用流程】
我也只是一個菜鳥,只閱讀了一部分該原始碼的原始碼,所以在這裡,我不討論AndroidVideoCache的實現原理,只講作為一個菜鳥,如何快速的使用它實現我們的需求。
1.我使用ExoPlayer實現音樂播放器,AndroidVideo實現音樂的邊播邊快取。在gradle的dependencies中引入兩個對應庫(引入最新版本)。
2.新建一個MyApplication繼承Application(記得在Manifest檔案裡,把Application的name修改為MyApplication),在這裡獲取一個單例模式的本地代理伺服器。cacheDirectory用於設定快取目錄,fileNameGenerator用於設定快取的命名規則。雖然說是叫“快取”,但是還是存在file裡比cache裡,檔案的存活機率更大。
public class MyApplication extends Application { private HttpProxyCacheServer proxy; public static HttpProxyCacheServer getProxy(Context context) { MyApplication myApplication = (MyApplication) context.getApplicationContext(); return myApplication.proxy == null ? (myApplication.proxy = myApplication.newProxy()) : myApplication.proxy; } private HttpProxyCacheServer newProxy() { return new HttpProxyCacheServer.Builder(this).cacheDirectory(Utils.getVideoCacheDir(this)) .fileNameGenerator(new MyFileNameGenerator()).build(); } public class MyFileNameGenerator implements FileNameGenerator {//快取的命名規則 public String generate(String url) { Uri uri = Uri.parse(url); String audioId = uri.getQueryParameter("guid"); return audioId + ".mp3"; } } }
/**
* 音樂播放快取目錄的設定
* @param context
* @return
*/
public static File getAudioCacheDir(Context context) {
return new File(context.getExternalFilesDir("music"), "audio-cache");
}
3.使用代理URL代替原始的網路URL,在Activity的onCreate方法中,初始化引數
private final String testUrl = "http://ws.stream.qqmusic.qq.com/M500001VfvsJ21xFqb.mp3?guid=ffffffff82def4af4b12b3cd9337d5e7&uin=346897220&vkey=6292F51E1E384E06DCBDC9AB7C49FD713D632D313AC4858BACB8DDD29067D3C601481D36E62053BF8DFEAF74C0A5CCFADD6471160CAF3E6A&fromtag=46"; MyApplication myApplication; HttpProxyCacheServer proxy; String proxyUrl; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RenderersFactory renderersFactory = new DefaultRenderersFactory(this); DefaultTrackSelector trackSelector = new DefaultTrackSelector(); LoadControl loadControl = new DefaultLoadControl(); mPlayer = ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector, loadControl); myApplication = (MyApplication) getApplication(); proxy = myApplication.getProxy(MainActivity.this); }
4.有一個問題是,AndroidVideoCache不只支援音訊,同樣支援視訊,所以不做特殊處理時,螢幕上會顯示一塊黑黑的視訊區域。我們的音樂播放器只需要一個控制組件,就直接使用PlaybackControlView元件就好了(我還找了好久怎麼把視訊區域set invisible,哭哭,其實人家把元件拆分清楚了)
5.另外UI的設計一般和原生的控制組件有些區別,這時候,我們可以複製貼上PlaybackControlView的程式碼,新建一個它引入的佈局檔案。在這裡把佈局替換成自己想要的樣式,比如像我下圖加個圖片啥的~ 此外,進度條TimeBar我們也可以用類似的方法進行修改。
要注意的是!!!!想和原來對應按鈕執行相同邏輯處理的,要使用ExoPlayer給定的id,可以檢視原來的佈局檔案進行檢視,都是exo_xxx這種id。自己新加入的元件,命名無所謂。
看一下效果圖
下一篇,我將記錄,如何將播放器遷移到後臺進行播放,實現退出Activity,鎖屏等情況下,音樂的持續播放。
姊妹篇: