1. 程式人生 > >Android AudioService VolumeController,音量UI更新

Android AudioService VolumeController,音量UI更新

在SystemUI啟動的時候就會主動去向AudioService註冊自己VolumeDialogControllerImpl內部實現了IVolumeController.Stub的VC。
後續音量調節也是通過這個VolumeController來完成UI更新的。
06-21 12:55:21.770  3122  3122 W System.err: java.lang.Exception: setVolumeController
06-21 12:55:21.771  3122  3122 W System.err: 	at com.android.systemui.volume.VolumeDialogControllerImpl.setVolumeController(VolumeDialogControllerImpl.java:150)
06-21 12:55:21.771  3122  3122 W System.err: 	at com.android.systemui.volume.VolumeDialogControllerImpl.register(VolumeDialogControllerImpl.java:176)
06-21 12:55:21.771  3122  3122 W System.err: 	at com.android.systemui.volume.VolumeDialogComponent.register(VolumeDialogComponent.java:171)
06-21 12:55:21.771  3122  3122 W System.err: 	at com.android.systemui.volume.VolumeUI.setDefaultVolumeController(VolumeUI.java:71)
06-21 12:55:21.771  3122  3122 W System.err: 	at com.android.systemui.volume.VolumeUI.start(VolumeUI.java:47)
06-21 12:55:21.771  3122  3122 W System.err: 	at com.android.systemui.SystemUIApplication.startServicesIfNeeded(SystemUIApplication.java:215)
06-21 12:55:21.771  3122  3122 W System.err: 	at com.android.systemui.SystemUIApplication.startServicesIfNeeded(SystemUIApplication.java:164)
06-21 12:55:21.771  3122  3122 W System.err: 	at com.android.systemui.SystemUIService.onCreate(SystemUIService.java:33)
06-21 12:55:21.771  3122  3122 W System.err: 	at android.app.ActivityThread.handleCreateService(ActivityThread.java:3339)
06-21 12:55:21.771  3122  3122 W System.err: 	at android.app.ActivityThread.-wrap4(Unknown Source:0)
06-21 12:55:21.771  3122  3122 W System.err: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1677)
06-21 12:55:21.771  3122  3122 W System.err: 	at android.os.Handler.dispatchMessage(Handler.java:106)
06-21 12:55:21.771  3122  3122 W System.err: 	at android.os.Looper.loop(Looper.java:164)
06-21 12:55:21.771  3122  3122 W System.err: 	at android.app.ActivityThread.main(ActivityThread.java:6494)
06-21 12:55:21.771  3122  3122 W System.err: 	at java.lang.reflect.Method.invoke(Native Method)
06-21 12:55:21.771  3122  3122 W System.err: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
06-21 12:55:21.772  3122  3122 W System.err: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
06-21 12:55:21.774  2979  3337 D AudioService: Volume controller: VolumeController(
[email protected]
,mVisible=false)
    @Override
    public void setVolumeController(final IVolumeController controller) {
        enforceVolumeController("set the volume controller");

        // return early if things are not actually changing
        if (mVolumeController.isSameBinder(controller)) {
            return;
        }

        // dismiss the old volume controller
        mVolumeController.postDismiss();
        if (controller != null) {
            // we are about to register a new controller, listen for its death
            try {
                controller.asBinder().linkToDeath(new DeathRecipient() {
                    @Override
                    public void binderDied() {
                        if (mVolumeController.isSameBinder(controller)) {
                            Log.w(TAG, "Current remote volume controller died, unregistering");
                            setVolumeController(null);
                        }
                    }
                }, 0);
            } catch (RemoteException e) {
                // noop
            }
        }
        mVolumeController.setController(controller);
        if (DEBUG_VOL) Log.d(TAG, "Volume controller: " + mVolumeController);
    private final class VC extends IVolumeController.Stub {
        private final String TAG = VolumeDialogControllerImpl.TAG + ".VC";

        @Override
        public void displaySafeVolumeWarning(int flags) throws RemoteException {
            if (D.BUG) Log.d(TAG, "displaySafeVolumeWarning "
                    + Util.audioManagerFlagsToString(flags));
            if (mDestroyed) return;
            mWorker.obtainMessage(W.SHOW_SAFETY_WARNING, flags, 0).sendToTarget();
        }

        @Override
        public void volumeChanged(int streamType, int flags) throws RemoteException {
            if (D.BUG) Log.d(TAG, "volumeChanged " + AudioSystem.streamToString(streamType)
                    + " " + Util.audioManagerFlagsToString(flags));
            if (mDestroyed) return;
            mWorker.obtainMessage(W.VOLUME_CHANGED, streamType, flags).sendToTarget();
        }

        @Override
        public void masterMuteChanged(int flags) throws RemoteException {
            if (D.BUG) Log.d(TAG, "masterMuteChanged");
        }

        @Override
        public void setLayoutDirection(int layoutDirection) throws RemoteException {
            if (D.BUG) Log.d(TAG, "setLayoutDirection");
            if (mDestroyed) return;
            mWorker.obtainMessage(W.LAYOUT_DIRECTION_CHANGED, layoutDirection, 0).sendToTarget();
        }

        @Override
        public void dismiss() throws RemoteException {
            if (D.BUG) Log.d(TAG, "dismiss requested");
            if (mDestroyed) return;
            mWorker.obtainMessage(W.DISMISS_REQUESTED, Events.DISMISS_REASON_VOLUME_CONTROLLER, 0)
                    .sendToTarget();
            mWorker.sendEmptyMessage(W.DISMISS_REQUESTED);
        }

        @Override
        public void setA11yMode(int mode) {
            if (D.BUG) Log.d(TAG, "setA11yMode to " + mode);
            if (mDestroyed) return;
            switch (mode) {
                case VolumePolicy.A11Y_MODE_MEDIA_A11Y_VOLUME:
                    // "legacy" mode
                    mShowA11yStream = false;
                    break;
                case VolumePolicy.A11Y_MODE_INDEPENDENT_A11Y_VOLUME:
                    mShowA11yStream = true;
                    break;
                default:
                    Log.e(TAG, "Invalid accessibility mode " + mode);
                    break;
            }
            mWorker.obtainMessage(W.ACCESSIBILITY_MODE_CHANGED, mShowA11yStream).sendToTarget();
        }
    }

相關推薦

Android AudioService VolumeController音量UI更新

在SystemUI啟動的時候就會主動去向AudioService註冊自己VolumeDialogControllerImpl內部實現了IVolumeController.Stub的VC。 後續音量調節也是通過這個VolumeController來完成UI更新的。06-21 1

Android混合開發html5自動更新爬過的坑

現在使用混合開發的公司越來越多,雖然出現了一些新技術,比如Facebook的react native、阿里的weex,但依然阻擋不了一些公司採用h5的決心,當然,這也是從多方面考慮的選擇。 在三年前就使用過html5混合開發,當時做的是一款貴金屬軟體,漲跌五線

Android混合開發html5自己主動更新爬過的坑

script loadurl 處理 必須 ack 功能 是個 code ppt 如今使用混合開發的公司越來越多,盡管出現了一些新技術,比方Facebook的react native、阿裏的weex,但依舊阻擋不了一些公司採用h5的決心。當然,這也是從多方

Android TabLayout+ViewPager+Fragment實現tab欄的時候無法實時更新ViewPager內的Fragment問題終極解決方法

TabLayout+ViewPager+Fragment模式在應用中必不可少,有時候我們可能會遇到tab欄會動態改變的問題,如新增,或刪減,這時候就需要把viewpager內相應的fragment新增或刪減; 如想做以下等操作? 1、更新單個item mDataList.remove(0

Android可以在子執行緒更新(重新整理)UI---"假象"

有時候,我們線上程裡面需要彈框,然而在用Toast彈框後,會出一個Can't create handler inside thread that has not called Looper.prepare()  錯誤。。。。原因很簡單就是因為安卓介面更新的操作需要在主執行緒操作. 實現

Android UI 更新

1 : 使用 handle sendMessage 把資料傳遞給主執行緒進行修改; 2 : 使用handle.post 方法中進行主執行緒 UI 的修改,(POST 方法就是排隊在主執行緒中執行) 3 : 使用 view.post 方法中進行 UI 修改(原理還是呼叫的 handle 的 p

Android中使用非同步執行緒更新UI檢視的幾種方法

在Android中子執行緒是不能更新ui的。 所以我們要通過其他方式來動態改變ui檢視, 1、runOnUiThreadactivity提供的一個輕量級更新ui的方法,在Fragment需要使用的時候要用getActivity.runOnUiThread開啟執行緒 這種方法最簡單,方便更新一些不需要判斷的

為什麼Android必須在主執行緒更新UI

為什麼Android必須在主執行緒更新UI? 站在各位大牛的肩膀上,謝謝! 正常情況下,Android需要在UI執行緒更新UI,然鵝,在特殊情況下,子執行緒也能更新UI不在討論之列,可參考Android中子執行緒真的不能更新UI嗎?這篇文章主要講一下個人理解的正常情況下為什麼不能在非

Android 子執行緒UI更新操作之二------AsyncTask

為了更方便的對子執行緒的中的UI進行操作,android提供了一些好用的工具,比如AsyncTask。藉助這個就可以簡單的從子執行緒切換到主執行緒。 當然這個工具也是基於非同步訊息處理機制的,只是安卓做了很好的封裝。 首先要說明的是AsyncTask是一個抽線類,要使用它

Android可以在子執行緒更新(重新整理)UI---"假象"

有時候,我們線上程裡面需要彈框,然而在用Toast彈框後,會出一個Can't create handler inside thread that has not called Looper.prepare()  錯誤。。。。原因很簡單就是因為安卓介面更新的操作需要在主執行緒操

Android API相容其他APIUI適配(3)

-- 在application的oncreate方法前 StrictMode.setThreadPolicy(new StrictModel.ThreadPolicy.Builder().detectAll().penaltyLog().build());  執行緒檢測策略; 虛擬機器檢測

Android API相容其他APIUI適配(2)

- Gson、FastJson、org.JSON到底哪一個效率更高,速度更快- https://blog.csdn.net/zml_2015/article/details/52165317 -- Try catch與throw new Exception的區別?  Try catch

Android API相容其他APIUI適配

Android XML shape 標籤使用詳解- http://www.cnblogs.com/popfisher/p/6238119.html shape寫line虛線的時候發現4.0以上機型很多都沒辦法顯示,後來在xml中 android:layerType="software" 

android開發之在activity中控制另一個activity的UI更新

第一種方法: 遇到一個問題,需要在一個activity中控制另一個acitivity做一些更新,沒想到傳遞handler的方法,通過以下方式解決。 1.在MyAPP中定義屬性handler package jason.com; import jason.com.MasterAc

RxJava實戰(後臺執行耗時操作實時通知 UI 更新

開源專案 RxJava-Android-Samples,這裡一共介紹了十八種RxJava2的使用場景,這一系列文章主要參考該專案進行。 我們經常會在後臺執行緒中去做一些耗時的操作,比如去網路取資料,處理的方法有 HandlerThread、Threa

android 檢查版本自動更新

<span style="font-size:14px;">怎麼檢索apk版本,然後自動更新?</span><span style="font-size:14px;">一共需要4步</span><span style="

Android初級開發----用Handle機制更新UI介面

引入: 之前對Android講義的一個小專案——–隨指尖移動的小球進行修改,利用View中的invalidate()方法實現每次觸碰螢幕更新(UI執行緒)小球的位置並且附加判斷大小,實現觸碰更新小球大小隨之更改顏色. API引入: 每次執行inva

Android探索之旅(第三十三篇)恩?你想成為Android架構師我這裡有料呦~~(持續更新中)

筆者認為你若想要成為熟悉及精通Android知識,勢必對於Gradle要求很是熟悉,推薦大家看徐宜生的《Android群英傳·神兵利器》,這本書最突出的就是它對於Gradle講解的非常詳細,讀完這本書之

Android通過AIDL實現跨程序更新UI

一、概述 本篇文章將和大家一起來學習AIDL實現跨程序更新UI。 需求是:在同一個應用中有兩個Activity,MainActivity和TempActivity,這兩個Activity不在同一個程序中。 現在需要通過TempActivity來改變Ma

Android:UI更新方法五:利用AsyncTask更新UI

關於AsyncTask的用法: 3個範型引數: Params啟動任務執行的輸入引數 Progress後臺任務執行的百分比 Result,後臺計算的結果型別 在一個非同步任務裡,不是所有的型別總被用。假如一個型別不被使用,可以簡單地使用Void型別: private c