原生態的android系統是沒有耳機插入或未插入的狀態指示的,本文就是講解如何添加耳機插入的狀態指示。如下
,當插入耳機後,在status bar上出現了一個耳機的表徵圖。
這個耳機的表徵圖和sim卡訊號等表徵圖在status bar的右邊,因此這個實現肯定不是通過notification實現的,那麼添加這個功能只能在framwork裡面尋找了。具體的修改步驟如下:
1.在frameworks/base/core/res/res/drawable-mdpi目錄先添加一個stat_sys_headset.png資源檔。這裡面資源檔的目錄要根據裝置的解析度來確定,我的裝置是HVGA的,因此資源檔放在drawable-mdpi目錄下。
2.修改frameworks/base/services/java/com/android/server/status/StatusBarPolicy.java
public class StatusBarPolicy {<br /> private static final String TAG = "StatusBarPolicy";<br /> private static StatusBarPolicy sInstance;<br /> ..... </p><p> // alarm clock<br /> // Icon lit when clock is set<br /> private IBinder mAlarmClockIcon;<br /> private IconData mAlarmClockIconData;<br /> //modify here start<br /> //HeadSet<br /> private IBinder mHeadSetPlugIcon;<br /> private IconData mHeadSetPlugIconData;<br /> //modify here end<br /> .....<br /> private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {<br /> @Override<br /> public void onReceive(Context context, Intent intent) {<br /> String action = intent.getAction();<br /> if (action.equals(Intent.ACTION_TIME_TICK)) {<br /> updateClock();<br /> }<br /> .....<br /> else if (action.equals(Intent.ACTION_ALARM_CHANGED)) {<br /> updateAlarm(intent);<br /> }<br /> //modify here start<br /> else if (action.equals(Intent.ACTION_HEADSET_PLUG)) {<br /> updateHeadset(intent);<br /> }<br /> //modify here end<br /> else if (action.equals(Intent.ACTION_SYNC_STATE_CHANGED)) {<br /> updateSyncState(intent);<br /> }<br /> ......<br /> };<br /> private StatusBarPolicy(Context context, StatusBarService service) {<br /> mContext = context;<br /> mService = service;<br /> mSignalStrength = new SignalStrength();<br /> if(FeatureOption.MTK_GEMINI_SUPPORT == true) {<br /> mSignalStrengthGemini = new SignalStrength();<br /> }<br /> mBatteryStats = BatteryStatsService.getService();<br /> ....<br /> //modify here start<br /> //HeadSet<br /> mHeadSetPlugIconData = IconData.makeIcon(<br /> "headset",<br /> null,com.android.internal.R.drawable.stat_sys_headset, 0, 0);<br /> mHeadSetPlugIcon = service.addIcon(mHeadSetPlugIconData, null);<br /> service.setIconVisibility(mHeadSetPlugIcon, false);<br /> //modify here end<br /> ....<br /> IntentFilter filter = new IntentFilter();<br /> // Register for Intent broadcasts for...<br /> filter.addAction(Intent.ACTION_TIME_TICK);<br /> ....<br /> //modify here start<br /> filter.addAction(Intent.ACTION_HEADSET_PLUG);<br /> //modify here end<br /> ....<br /> }<br /> //modify here start<br /> private final void updateHeadset(Intent intent) {<br /> Slog.d(TAG, "updateHeadset: state=" + intent.getIntExtra("state", 0));<br /> mService.setIconVisibility(mHeadSetPlugIcon, (intent.getIntExtra("state", 0) == 1)?true:false);<br /> }<br /> //modify here end<br /> .....<br />}
3.修改frameworks/base/core/res/res/values/arrays.xml
<string-array name="status_bar_icon_order"><br /> <item><xliff:g id="id">clock</xliff:g></item><br /> <item><xliff:g id="id">secure</xliff:g></item><br /> <item><xliff:g id="id">alarm_clock</xliff:g></item><br /> <item><xliff:g id="id">battery</xliff:g></item><br /> <item><xliff:g id="id">phone_signal_2</xliff:g></item><br /> <item><xliff:g id="id">phone_signal</xliff:g></item><br /> <item><xliff:g id="id">phone_evdo_signal</xliff:g></item><br /> <item><xliff:g id="id">data_connection</xliff:g></item><br /> <item><xliff:g id="id">cdma_eri</xliff:g></item><br /> <item><xliff:g id="id">tty</xliff:g></item><br /> <item><xliff:g id="id">volume</xliff:g></item><br /> <item><xliff:g id="id">mute</xliff:g></item><br /> <item><xliff:g id="id">speakerphone</xliff:g></item><br /> <!-- modify here start. --><br /> <item><xliff:g id="id">headset</xliff:g></item><br /> <!-- modify here end --><br /> <item><xliff:g id="id">wifi</xliff:g></item><br /> <item><xliff:g id="id">tty</xliff:g></item><br /> <item><xliff:g id="id">bluetooth</xliff:g></item><br /> <item><xliff:g id="id">gps</xliff:g></item><br /> <item><xliff:g id="id">sync_active</xliff:g></item><br /> <item><xliff:g id="id">sync_failing</xliff:g></item><br /> <item><xliff:g id="id">ime</xliff:g></item><br /> </string-array>
其中“headset”這個字串就是“mHeadSetPlugIconData = IconData.makeIcon( "headset", null0, 0);”中的第一個參數。“<item><xliff:g id="id">headset</xliff:g></item> ”這個語句的位置於表徵圖在status
bar上顯示的位置有關。