- 01.传统一点的做法
- 02.如何实现统一埋点
- 03.具体实现代码案例
- 04.如何配置使用
- 传统一点的做法
- 比如用友盟或者百度统计,或者用其他的统计。之前的做法是,在每个有视频的页面比如说Activity,Fragment等开启时视频播放时埋点一次,页面退出时埋点一次。
- 如果app中有多个activity或者fragment页面,那么就每个页面都要进行埋点。比如如果你的app是付费视频,你想知道有多少人试看了,该怎么操作。那么你需要在每一个有视频的activity页面挨个添加埋点,那还有没有更好的办法?
- 解决方案
- 举个例子:例如,你需要来让外部开发者手动去埋点,可是在类中怎么埋点又是由其他人来设计的,你只是需要对外暴露监听的方法。那么该如何做呢?采用接口 + 实现类方式即可实现。
- 该案例中怎么操作
- 定义一个接口,规定其他人设计类,必须继承这个接口。在这个接口中,定义进入视频播放,退出视频播放器,记录播放进度,视频播放完成,播放异常,点击广告,点击试看等操作的抽象方法。具体可以看BuriedPointEvent类代码……
- 外部开发者如何使用
- 定义一个类实现该视频埋点接口,重写里面方法。然后需要在初始化配置视频播放器的时候,将这个实现类的对象传递进来即可。通过这个配置类传进来的对象,播放器就可以处理监听设置逻辑呢。
- 这种操作最大的好处就是:在这个类中统一处理视频的埋点,修改快捷,而不用在每一个有视频播放器的页面埋点,方便维护。
- 如何监听进入视频播放,刚开始想着在play方法中监听,后来发现不太好。改为在设置视频url时监听,即代表进入视频播放开始
//在VideoPlayer类中 /** * 设置包含请求头信息的视频地址 * * @param url 视频地址 * @param headers 请求头 */ public void setUrl(String url, Map<String, String> headers) { VideoPlayerConfig config = VideoViewManager.getConfig(); if (config!=null && config.mBuriedPointEvent!=null){ //相当于进入了视频页面 config.mBuriedPointEvent.playerIn(url); } }
- 如何监听视频退出播放,以及退出播发时候的播放进度百分比,这个方便统计用户看视频情况
/** * 释放播放器 */ public void release() { if (!isInIdleState()) { VideoPlayerConfig config = VideoViewManager.getConfig(); if (config!=null && config.mBuriedPointEvent!=null){ //退出视频播放 config.mBuriedPointEvent.playerDestroy(mUrl); //计算退出视频时候的进度 long duration = getDuration(); long currentPosition = getCurrentPosition(); float progress = (currentPosition*1.0f) / (duration*1.0f) ; config.mBuriedPointEvent.playerOutProgress(mUrl,progress); } } }
- 如何监听视频播放完了,这样做主要是查看用户的播放完成率,方便分析
/** * 视频播放完成回调 */ @Override public void onCompletion() { VideoPlayerConfig config = VideoViewManager.getConfig(); if (config!=null && config.mBuriedPointEvent!=null){ //视频播放完成 config.mBuriedPointEvent.playerCompletion(mUrl); } }
- 然后测试一下,打印日志如下所示
2020-10-16 11:07:04.398 5534-5534/org.yczbj.ycvideoplayer I/YCVideoPlayer: BuriedPointEvent---进入视频播放--http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4 2020-10-16 11:07:16.006 5534-5534/org.yczbj.ycvideoplayer I/YCVideoPlayer: BuriedPointEvent---视频播放完成--http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4 2020-10-16 11:07:30.566 5534-5534/org.yczbj.ycvideoplayer I/YCVideoPlayer: BuriedPointEvent---视频播放异常--http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4 2020-10-16 11:07:41.107 5534-5534/org.yczbj.ycvideoplayer I/YCVideoPlayer: BuriedPointEvent---退出视频播放--http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4 2020-10-16 11:07:41.107 5534-5534/org.yczbj.ycvideoplayer I/YCVideoPlayer: BuriedPointEvent---退出视频播放时候的播放进度百度分--http://vfx.mtime.cn/Video/2019/02/04/mp4/190204084208765161.mp4
- 只需要在初始化配置的时候,创建埋点监听类,代码如下所示,具体代码可以看BuriedPointEventImpl类。
//播放器配置,注意:此为全局配置,按需开启 PlayerFactory player = PlayerFactoryUtils.getPlayer(PlayerConstant.PlayerType.TYPE_IJK); VideoViewManager.setConfig(VideoPlayerConfig.newBuilder() //设置上下文 .setContext(this) //设置视频全局埋点事件 .setBuriedPointEvent(new BuriedPointEventImpl()) //调试的时候请打开日志,方便排错 .setLogEnabled(true) //设置ijk .setPlayerFactory(player) .build());
- 关于BuriedPointEventImpl类代码说明,必须继承BuriedPointEvent约定的接口。这样操作就特别方面视频埋点操作,方便统一处理……
public class BuriedPointEventImpl implements BuriedPointEvent { /** * 进入视频播放 * @param url 视频url */ @Override public void playerIn(String url) { VideoLogUtils.i("BuriedPointEvent---进入视频播放--"+url); } /** * 退出视频播放 * @param url 视频url */ @Override public void playerDestroy(String url) { VideoLogUtils.i("BuriedPointEvent---退出视频播放--"+url); } /** * 视频播放完成 * @param url 视频url */ @Override public void playerCompletion(String url) { VideoLogUtils.i("BuriedPointEvent---视频播放完成--"+url); } /** * 视频播放异常 * @param url 视频url * @param isNetError 是否是网络异常 */ @Override public void onError(String url, boolean isNetError) { VideoLogUtils.i("BuriedPointEvent---视频播放异常--"+url); } /** * 点击了视频广告 * @param url 视频url */ @Override public void clickAd(String url) { VideoLogUtils.i("BuriedPointEvent---点击了视频广告--"+url); } /** * 视频试看点击 * @param url 视频url */ @Override public void playerAndProved(String url) { VideoLogUtils.i("BuriedPointEvent---视频试看点击--"+url); } /** * 退出视频播放时候的播放进度百度比 * @param url 视频url * @param progress 视频进度,计算百分比【退出时候进度 / 总进度】 */ @Override public void playerOutProgress(String url, float progress) { VideoLogUtils.i("BuriedPointEvent---退出视频播放时候的播放进度百度比--"+url+"-----"+progress); } /** * 退出视频播放时候的播放进度 * @param url 视频url * @param duration 总时长 * @param currentPosition 当前进度时长 */ @Override public void playerOutProgress(String url, long duration, long currentPosition) { VideoLogUtils.i("BuriedPointEvent---退出视频播放时候的播放进度百度比--"+url+"-----"+duration+"----"+currentPosition); } /** * 视频切换音频 * @param url 视频url */ @Override public void videoToMedia(String url) { VideoLogUtils.i("BuriedPointEvent---视频切换音频--"+url); } }