Android 自定义MediaController

做播放器通常会用到MediaController这个控制器,但系统MediaController的UI通常又要修改,于是我想到3个思路:1.自己写一个,卧槽return false不解释。2.继承MediaController,尝试过发现私有Field和Method不好弄false。3.copy代码,是他是他就是他~


1.创建MyMediaController:

好了,就是从MediaConrtoller里copy代码

public class MyMediaController extends FrameLayout{

//内容...内容...

}


2.处理报错:

这时候会发现三个报错:

1.mAccessibilityManager= AccessibilityManager.getInstance(context);

getInstance方法虽然是public的,但是@hide不能使用,所以报错。

AccessibilityManager类是无障碍服务的,暂时不需要,砍掉吧。。。如果要用,可以用反射机制调用。

2.mWindow =newPhoneWindow(mContext);

找不到这个类,ok,利用反射创建:

(注意,MediaController导包com.android.internal.policy.PhoneWindow位置貌似有点问题,应该是com.android.internal.policy.impl.PhoneWindow)

代码:

[java]  view plain  copy
  1. try {  
  2. Class clazz = Class.forName("com.android.internal.policy.impl.PhoneWindow");  
  3. Constructor constructor = clazz.getDeclaredConstructor(Context.class);  
  4. mWindow = (Window) constructor.newInstance(mContext);  
  5. catch (Exception e) {  
  6. e.printStackTrace();  
  7. }  

另外,网上找到另外个实现方法mWindow = PolicyManager.makeNewWindow(mContext);也能用反射得出,包是com.android.internal.policy.PolicyManager

3.mPlayDescription和mPauseDescription

这两货貌似是朗读描述的,删了。。。


3.修改UI:

1.在 makeControllerView里面改成我们的布局:
[html]  view plain  copy
  1. mRoot = inflate.inflate(R.layout.mymedia_controller, null);  
[html]  view plain  copy
  1.   
2.在initControllerView(View view)方法里面把com.android.internal.R替换成我们的R,再替换成我们的资源就行啦。

3.另外系统布局里面的上一首pre和下一首next是Gone的,设置了Listener才会显示,可以在外面的MediaConrtoller对象调用 setPrevNextListeners方法就能显示了。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值