1. 程式人生 > >【Android】音樂播放器邊播邊快取(一)AndroidVideoCache的使用方法

【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,鎖屏等情況下,音樂的持續播放。

姊妹篇: