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,锁屏等情况下,音乐的持续播放。

参考 :  AndroidVideoCache 墙裂推荐

Github地址: Github项目地址

猜你喜欢

转载自blog.csdn.net/crab0314/article/details/80135695