做播放器通常會用到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
- 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();
- }
另外,網上找到另外個實作方法mWindow = PolicyManager.makeNewWindow(mContext);也能用反射得出,包是com.android.internal.policy.PolicyManager。
3.mPlayDescription和mPauseDescription
這兩貨貌似是朗讀描述的,删了。。。
3.修改UI:
1.在 makeControllerView裡面改成我們的布局: [html] view plain copy
- 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方法就能顯示了。