1. 程式人生 > >Android狀態列顯示藍芽耳機電量

Android狀態列顯示藍芽耳機電量

1.HeadsetStateMachine.java

    static {
        classInitNative();
        VENDOR_SPECIFIC_AT_COMMAND_COMPANY_ID = new HashMap<String, Integer>();
        VENDOR_SPECIFIC_AT_COMMAND_COMPANY_ID.put("+XEVENT", BluetoothAssignedNumbers.PLANTRONICS);
        VENDOR_SPECIFIC_AT_COMMAND_COMPANY_ID.put
("+ANDROID", BluetoothAssignedNumbers.GOOGLE); // 新增以下兩行 VENDOR_SPECIFIC_AT_COMMAND_COMPANY_ID.put("+XAPL", BluetoothAssignedNumbers.APPLE); VENDOR_SPECIFIC_AT_COMMAND_COMPANY_ID.put("+IPHONEACCEV", BluetoothAssignedNumbers.APPLE); }

2.PhoneStatusBarPolicy.java

    public PhoneStatusBarPolicy
(Context context, CastController cast, HotspotController hotspot, UserInfoController userInfoController, BluetoothController bluetooth) { filter.addAction(BluetoothHeadset.ACTION_VENDOR_SPECIFIC_HEADSET_EVENT); filter.addCategory(BluetoothHeadset.VENDOR_SPECIFIC_HEADSET_EVENT_COMPANY_ID_CATEGORY + "."
+ BluetoothAssignedNumbers.APPLE); mContext.registerReceiver(mIntentReceiver, filter, null, mHandler); } private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // 新增如下接收 else if (action.equals(BluetoothHeadset.ACTION_VENDOR_SPECIFIC_HEADSET_EVENT)) { updateBluetoothBattery(intent); } } }; private void updateBluetoothBattery(Intent intent) { if (intent.hasExtra(BluetoothHeadset.EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD)) { String command = intent.getStringExtra(BluetoothHeadset.EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD); if ("+IPHONEACCEV".equals(command)) { Object[] args = (Object[]) intent.getSerializableExtra(BluetoothHeadset.EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_ARGS); if (args.length >= 3 && args[0] instanceof Integer && ((Integer)args[0])*2+1<=args.length) { for (int i=0;i<((Integer)args[0]);i++) { if (!(args[i*2+1] instanceof Integer) || !(args[i*2+2] instanceof Integer)) { continue; } if (args[i*2+1].equals(1)) { mBluetoothBatteryLevel = (((Integer)args[i*2+2])+1)/10.0f; updateBluetooth(); break; } } } } } } private final void updateBluetooth() { int iconId = R.drawable.stat_sys_data_bluetooth; String contentDescription = mContext.getString(R.string.accessibility_quick_settings_bluetooth_on); boolean bluetoothEnabled = false; if (mBluetooth != null) { bluetoothEnabled = mBluetooth.isBluetoothEnabled(); if (mBluetooth.isBluetoothConnected()) { if (mBluetoothBatteryLevel == null) { iconId = R.drawable.stat_sys_data_bluetooth_connected; } else { if (mBluetoothBatteryLevel <= 0.15f) { iconId = R.drawable.stat_sys_data_bluetooth_connected_battery_0; } else if (mBluetoothBatteryLevel <= 0.25f) { iconId = R.drawable.stat_sys_data_bluetooth_connected_battery_1; } else if (mBluetoothBatteryLevel <= 0.375f) { iconId = R.drawable.stat_sys_data_bluetooth_connected_battery_2; } else if (mBluetoothBatteryLevel <= 0.625f) { iconId = R.drawable.stat_sys_data_bluetooth_connected_battery_3; } else if (mBluetoothBatteryLevel <= 0.85f) { iconId = R.drawable.stat_sys_data_bluetooth_connected_battery_4; } else { iconId = R.drawable.stat_sys_data_bluetooth_connected_battery_5; } } contentDescription = mContext.getString(R.string.accessibility_bluetooth_connected); } else { mBluetoothBatteryLevel = null; } } mService.setIcon(SLOT_BLUETOOTH, iconId, 0, contentDescription); mService.setIconVisibility(SLOT_BLUETOOTH, bluetoothEnabled); }

如上,藍芽耳機一般會針對 iOS 做定製。而沒有針對Android做定製。

附上HFP命令AT+IPHONEACCEV

描述:報告耳機的狀態變更
發起者:耳機
格式:AT+IPHONEACCEV=[Number of key/value pairs ],[key1 ],[val1 ],[key2 ],[val2 ],...
引數:
    Number of key/value pairs : 接下來引數的數量
    key: 被報告狀態變化的型別
        1 = 電量等級
        2 = 暫停狀態
    val: 更改的值
        Battery events:0-9之間數字的字串 A string value between '0' and '9'.
        Dock state: 0 = undocked, 1 = docked.
Example: AT+IPHONEACCEV=1,1,3