自定义MediaController在Android TV端上的使用

前几天在TV端项目中用到IjkPlayer,需要自定义控制条MediaController,使得电视机遥控器可以控制视频的播放、暂停、快进、回退等。
首先想到的是将MediaController的源码copy过来,命名为CustomMediaController,然后进行修改(用到的地方保留,用不到的地方就删除)。
PS:当然也有其他方法,比如使用PopWindow,在这里就不讲了,大家可以自己试试。

代码copy过来之后,遇到一个问题:
mWindow = new PhoneWindow(mContext);
报错:Cannot resolve symbol 'PhoneWindow'
查看了PhoneWindow的源码,发现PhoneWindow类是@hide状态的,不能直接使用。

找度娘问了下,结果不尽如人意。
大多数都是讲使用反射获取PhoneWindow对象,然后创建它的构造器,获得Window对象:
try {
Class clazz = Class.forName("com.android.internal.policy.impl.PhoneWindow");
Constructor constructor = clazz.getDeclaredConstructor(Context.class);
mWindow = (Window) constructor.newInstance(mContext);
} catch (Exception e) {
e.printStackTrace();
}
这种方法在Android6.0以下的版本是可以的,在6.0及6.0以上的版本同样会报错,所以此方式排除。

后来想到MediaController是要在Activity中使用的,是否可以利用Activity的引用Context得到Window,在Activity的源码中看了一下,果然有
public Window getWindow(){
return mWindow;
}
定义一个Context变量,然后在CustomMediaController的initFloatingWindow方法中,修改
if (mContext instanceof Activity) {
Activity context = (Activity) mContext;
mWindow = context.getWindow();
}
得到Window对象(别忘了Context要作为CustomMediaController构造函数的一个参数)
这样的话进入视频播放页面就不会崩溃了,但是事情把还没完呢...

以上的效果出来之后,按下遥控器的左右键,视频不会快进或者回退。
当然有可能是代码中没有设置对应的功能,这时要检查一下Activity中的代码,看下有没有这两句:
ijkVideo.canSeekForward();
ijkVideo.canSeekBackward();
这是设置视频可以快进、回退功能的代码。
设置好之后,运行项目,还是不行!! 按下遥控器左右键仍然没反应。

考虑到应该是遥控器左右键的事件没有传递到CustomMediaController中,MediaController的代码中已经重写dispatchkeyEvent(KeyEvent event),
只需要在activity文件中,重写dispatchKeyEvent(KeyEvent event)方法,然后
if (keycode == KeyEvent.KEYCODE_DPAD_RIGHT || keycode == KeyEvent.KEYCODE_DPAD_LEFT) {
mediaController.dispatchKeyEvent(event);
}
即可。
这时就可以使用遥控器左右键对视频进行快进、回退控制了。

Android项目在TV端上和移动端上的开发大体相同,主要区别是在焦点控制和事件传递两个方面。只要熟悉了这两个方面,其他的就和开发移动端应用一样了。以后会写一些TV端关于焦点控制和事件传递方面的文章,希望大家喜欢~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值