Android 耳机插入过程分析

参考链接:https://www.jianshu.com/p/d82a8dabb3e7初始化:10-26 07:40:43.932  1414  1414 I SystemServer: StartWiredAccessoryManager10-26 07:40:43.936  1414  1414 W WiredAccessoryManager: This kernel does not have usb audio support10-26 07:40:43.937  1414  1414 W WiredAccessoryManager: This kernel does not have HDMI audio support10-26 07:40:43.937  1414  1414 W WiredAccessoryManager: This kernel does not have DP audio support10-26 07:40:43.937  1414  1414 D SystemServerTiming: StartWiredAccessoryManager took to complete: 6ms10-26 07:40:46.375  1414  1414 V WiredAccessoryManager: notifyWiredAccessoryChanged: when=0 bits= mask=5410-26 07:40:46.375  1414  1414 V WiredAccessoryManager: newName=h2w newState=0 headsetState=0 prev headsetState=010-26 07:40:46.375  1414  1414 E WiredAccessoryManager: No state change.10-26 07:40:46.375  1414  1414 V WiredAccessoryManager: init()耳机插入10-26 11:26:48.552  1414  1684 V WiredAccessoryManager: notifyWiredAccessoryChanged: when=13604972191000 bits=SW_HEADPHONE_INSERT SW_MICROPHONE_INSERT mask=9410-26 11:26:48.552  1414  1684 V WiredAccessoryManager: newName=h2w newState=1 headsetState=1 prev headsetState=010-26 11:26:48.554  1414  1684 I WiredAccessoryManager: MSG_NEW_DEVICE_STATE10-26 11:26:48.555  1414  1414 V WiredAccessoryManager: headsetName:  connected耳机拔出10-26 11:26:53.134  1414  1684 V WiredAccessoryManager: notifyWiredAccessoryChanged: when=13609554723000 bits= mask=9410-26 11:26:53.134  1414  1684 V WiredAccessoryManager: newName=h2w newState=0 headsetState=0 prev headsetState=110-26 11:26:53.136  1414  1684 I WiredAccessoryManager: MSG_NEW_DEVICE_STATE10-26 11:26:53.137  1414  1414 V WiredAccessoryManager: headsetName:  disconnected高通读取外设插入方式有两种:1. UEvent:读取/sys/class/switch/h2w/state文件等状态2. InputEvent:读取/dev/input/event通过属性值,判断采用何种方式。frameworks\base\core\res\res\values\config.xmltruegeteventadd device 1: /dev/input/event7  name:     "msm8953-snd-card-mtp Button Jack"add device 2: /dev/input/event6  name:     "msm8953-snd-card-mtp Headset Jack"add device 3: /dev/input/event2  name:     "goodix-ts"add device 4: /dev/input/event3  name:     "hbtp_vm"could not get driver version for /dev/input/mouse0, Not a typewriteradd device 5: /dev/input/event0  name:     "qpnp_pon"could not get driver version for /dev/input/mice, Not a typewriteradd device 6: /dev/input/event1  name:     "tsu6721"add device 7: /dev/input/event4  name:     "keyremap_virtual"add device 8: /dev/input/event5  name:     "gpio-keys"  插入:/dev/input/event6: 0005 0002 00000001/dev/input/event6: 0005 0004 00000001/dev/input/event6: 0005 0007 00000001/dev/input/event6: 0000 0000 00000000拔出:/dev/input/event6: 0005 0002 00000000/dev/input/event6: 0005 0004 00000000/dev/input/event6: 0005 0007 00000000/dev/input/event6: 0000 0000 00000000getevent -l/dev/input/event6: EV_SW        SW_HEADPHONE_INSERT  00000001/dev/input/event6: EV_SW        SW_MICROPHONE_INSERT 00000001/dev/input/event6: EV_SW        SW_JACK_PHYSICAL_INS 00000001/dev/input/event6: EV_SYN       SYN_REPORT           00000000/dev/input/event6: EV_SW        SW_HEADPHONE_INSERT  00000000/dev/input/event6: EV_SW        SW_MICROPHONE_INSERT 00000000/dev/input/event6: EV_SW        SW_JACK_PHYSICAL_INS 00000000/dev/input/event6: EV_SYN       SYN_REPORT           00000000代码跟踪frameworks\base\services\core\java\com\android\server\input\InputManagerService.javamUseDevInputEventForAudioJack =                context.getResources().getBoolean(R.bool.config_useDevInputEventForAudioJack);                        if (mUseDevInputEventForAudioJack && (switchMask & SW_JACK_BITS) != 0) {            mWiredAccessoryCallbacks.notifyWiredAccessoryChanged(whenNanos, switchValues,                    switchMask);        }            frameworks\base\services\core\java\com\android\server\WiredAccessoryManager.java    public void notifyWiredAccessoryChanged(long whenNanos, int switchValues, int switchMask) {        if (LOG) Slog.v(TAG, "notifyWiredAccessoryChanged: when=" + whenNanos                + " bits=" + switchCodeToString(switchValues, switchMask)                + " mask=" + Integer.toHexString(switchMask));        synchronized (mLock) {            int headset;            mSwitchValues = (mSwitchValues & ~switchMask) | switchValues;            switch (mSwitchValues &                (SW_HEADPHONE_INSERT_BIT | SW_MICROPHONE_INSERT_BIT | SW_LINEOUT_INSERT_BIT)) {                case 0:                    headset = 0;                    break;                case SW_HEADPHONE_INSERT_BIT:                    headset = BIT_HEADSET_NO_MIC;                    break;                case SW_LINEOUT_INSERT_BIT:                    headset = BIT_LINEOUT;                    break;                case SW_HEADPHONE_INSERT_BIT | SW_MICROPHONE_INSERT_BIT:                    headset = BIT_HEADSET;                    break;                case SW_MICROPHONE_INSERT_BIT:                    headset = BIT_HEADSET;                    break;                default:                    headset = 0;                    break;            }            updateLocked(NAME_H2W,                (mHeadsetState & ~(BIT_HEADSET | BIT_HEADSET_NO_MIC | BIT_LINEOUT)) | headset);        }    }            private void updateLocked(String newName, int newState) {        // Retain only relevant bits        int headsetState = newState & SUPPORTED_HEADSETS;        int usb_headset_anlg = headsetState & BIT_USB_HEADSET_ANLG;        int usb_headset_dgtl = headsetState & BIT_USB_HEADSET_DGTL;        int h2w_headset = headsetState & (BIT_HEADSET | BIT_HEADSET_NO_MIC | BIT_LINEOUT);        boolean h2wStateChange = true;        boolean usbStateChange = true;        if (LOG) Slog.v(TAG, "newName=" + newName                + " newState=" + newState                + " headsetState=" + headsetState                + " prev headsetState=" + mHeadsetState);        if (mHeadsetState == headsetState) {            Log.e(TAG, "No state change.");            return;        }        // reject all suspect transitions: only accept state changes from:        // - a: 0 headset to 1 headset        // - b: 1 headset to 0 headset        if (h2w_headset == (BIT_HEADSET | BIT_HEADSET_NO_MIC | BIT_LINEOUT)) {            Log.e(TAG, "Invalid combination, unsetting h2w flag");            h2wStateChange = false;        }        // - c: 0 usb headset to 1 usb headset        // - d: 1 usb headset to 0 usb headset        if (usb_headset_anlg == BIT_USB_HEADSET_ANLG && usb_headset_dgtl == BIT_USB_HEADSET_DGTL) {            Log.e(TAG, "Invalid combination, unsetting usb flag");            usbStateChange = false;        }        if (!h2wStateChange && !usbStateChange) {            Log.e(TAG, "invalid transition, returning ...");            return;        }        mWakeLock.acquire();        // 发送数据给        Log.i(TAG, "MSG_NEW_DEVICE_STATE");        Message msg = mHandler.obtainMessage(MSG_NEW_DEVICE_STATE, headsetState,                mHeadsetState, "");        mHandler.sendMessage(msg);        mHeadsetState = headsetState;    }    private final Handler mHandler = new Handler(Looper.myLooper(), null, true) {        @Override        public void handleMessage(Message msg) {            switch (msg.what) {                case MSG_NEW_DEVICE_STATE:                    setDevicesState(msg.arg1, msg.arg2, (String)msg.obj);                    mWakeLock.release();                    break;                case MSG_SYSTEM_READY:                    onSystemReady();                    mWakeLock.release();                    break;            }        }    };    private void setDevicesState(            int headsetState, int prevHeadsetState, String headsetName) {        synchronized (mLock) {            int allHeadsets = SUPPORTED_HEADSETS;            for (int curHeadset = 1; allHeadsets != 0; curHeadset <<= 1) {                if ((curHeadset & allHeadsets) != 0) {                    setDeviceStateLocked(curHeadset, headsetState, prevHeadsetState, headsetName);                    allHeadsets &= ~curHeadset;                }            }        }    }    private void setDeviceStateLocked(int headset,            int headsetState, int prevHeadsetState, String headsetName) {        if ((headsetState & headset) != (prevHeadsetState & headset)) {            int outDevice = 0;            int inDevice = 0;            int state;            if ((headsetState & headset) != 0) {                state = 1;            } else {                state = 0;            }            if (headset == BIT_HEADSET) {                outDevice = AudioManager.DEVICE_OUT_WIRED_HEADSET;                inDevice = AudioManager.DEVICE_IN_WIRED_HEADSET;            } else if (headset == BIT_HEADSET_NO_MIC){                outDevice = AudioManager.DEVICE_OUT_WIRED_HEADPHONE;            } else if (headset == BIT_LINEOUT){                outDevice = AudioManager.DEVICE_OUT_LINE;            } else if (headset == BIT_USB_HEADSET_ANLG) {                outDevice = AudioManager.DEVICE_OUT_ANLG_DOCK_HEADSET;            } else if (headset == BIT_USB_HEADSET_DGTL) {                outDevice = AudioManager.DEVICE_OUT_DGTL_DOCK_HEADSET;            } else if (headset == BIT_HDMI_AUDIO) {                outDevice = AudioManager.DEVICE_OUT_HDMI;            } else {                Slog.e(TAG, "setDeviceState() invalid headset type: "+headset);                return;            }            if (LOG) {                Slog.v(TAG, "headsetName: " + headsetName +                        (state == 1 ? " connected" : " disconnected"));            }            // 发送给audio manager.            if (outDevice != 0) {              mAudioManager.setWiredDeviceConnectionState(outDevice, state, "", headsetName);            }            if (inDevice != 0) {              mAudioManager.setWiredDeviceConnectionState(inDevice, state, "", headsetName);            }        }    }

更多相关文章

  1. android kernel 初始化 2
  2. Android MediaServer初始化流程
  3. Android 监听耳机外放设备
  4. Android耳机按键监听
  5. Android 初始化Setup Wizard——Provision
  6. Android 编译流程解析01-AppPlugin初始化
  7. android 软键盘隐藏 activity初始化时edittext聚焦

随机推荐

  1. Android平台开发-Android(安卓)keypad ma
  2. android studio上HierarchyViewer的使用
  3. 一些关于Activity的技巧
  4. android之Display.getRotation()_传感器
  5. Android数据库编程教程
  6. android Handler导致内存泄露分析
  7. Android中贪吃蛇游戏的学习(三)
  8. Android拖拽详解
  9. Android(安卓)am命令
  10. android ViewPager 竖向滑动