1. 程式人生 > >Android4.4監聽耳機插入處理方法

Android4.4監聽耳機插入處理方法

Android系統硬體檢測到耳機插入,並告訴底層當前插入的是純耳機,還是帶Mic的耳機。
底層在CallBack中接收到耳機插入訊息後,傳送廣播告訴上層,傳送廣播的action是
Intent.ACTION_HEADSET_PLUG。

一、Android4.4系統中處理耳機插入,在StatusBar中像手機訊號一樣的動態顯示效果方法如下:
1.frameworks/base/core/res/res/values/config.xml中的屬性config_statusBarIcons
  中加入id為headset,用來在StatusBarIcon中建立headset對應的圖示:
  <item><xliff:g id="id">headset</xliff:g></item>

2.frameworks/base/packages/SystemUI/res/drawable-mdpi/中加入StatusBar中要顯示的圖示
stat_sys_headset_with_mic.png    //有mic的耳機
stat_sys_headset_without_mic.png    //無mic的耳機

3.frameworks/base/packages/SystemUI/com.android.systemui.statusbar.phone.PhoneStatusBarPolicy.java

  中mIntentReceiver加入耳機插入的廣播處理:

else if (action.equals(Intent.ACTION_HEADSET_PLUG)) {
       updateHeadSet(intent);
}
private final void updateHeadSet(Intent intent) {
    int state = intent.getIntExtra("state", -1);
    int mic = intent.getIntExtra("microphone", -1);
    Log.d(TAG, "=========updateHeadSet, state=" + state + ", mic=" + mic + ".");
    if (state == -1 || mic == -1) {
        return;
    }
    if (state == 1) {
        if (mic == 1) {
            mService.setIcon("headset", R.drawable.stat_sys_headset_with_mic, 0, null);
            mService.setIconVisibility("headset", true);
        } else {
            mService.setIcon("headset", R.drawable.stat_sys_headset_without_mic, 0, null);
            mService.setIconVisibility("headset", true);
        }
        // vibrate when headset plug in
        Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
        vibrator.vibrate(500);
    } else {
        mService.setIconVisibility("headset", false);
    }
  }

4.frameworks/base/services/java/com.android.server.StatusBarManagerService.java
  中實現setIconVisibility介面,並呼叫StatusBar中setIcon介面實現顯示或取消耳機圖示。

二、若是應用中要監聽耳機插入動作,可以監聽action為Intent.ACTION_HEADSET_PLUG的廣播,
但是不能使用全域性的BroadcastReceiver接收,即是不能在應用AndroidManifest.xml中配置廣播接收器。
需在應用Activity或者是Service中,定義廣播接收器,接收到廣播後做相應的處理即可。