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方法就能显示了。

你可能感兴趣的:(Android 自定义MediaController)