天天看點

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

2.在initControllerView(View view)方法裡面把com.android.internal.R替換成我們的R,再替換成我們的資源就行啦。

3.另外系統布局裡面的上一首pre和下一首next是Gone的,設定了Listener才會顯示,可以在外面的MediaConrtoller對象調用 setPrevNextListeners方法就能顯示了。