最近在做音乐播放器类的需求,做了一段时间,抽出一段时间来整理一下。
【前言】
首先,记录一下如何找到我们与需求相关的开源库。可以在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,锁屏等情况下,音乐的持续播放。
Github地址: Github项目地址