上周去某手机公司面试蓝牙方面开发工作,被鄙视了,很多蓝牙底层的东西确实不了解,蓝牙实际项目经验少。
有个关于蓝牙耳机的按键怎么映射到系统里面的问题,刚刚看了一下。
1)如果是HFP按键,
则是耳机是通过AT命令发送到手机侧的。
代码位于BluetoothHandsfree.java
Hang-up 命令:
// Hang-up commandparser.register("+CHUP", new AtCommandHandler() { @Override public AtCommandResult handleActionCommand() { sendURC("OK"); if (isVirtualCallInProgress()) { terminateScoUsingVirtualVoiceCall(); } else { if (mCM.hasActiveFgCall()) { PhoneUtils.hangupActiveCall(mCM.getActiveFgCall()); } else if (mCM.hasActiveRingingCall()) { PhoneUtils.hangupRingingCall(mCM.getFirstActiveRingingCall()); } else if (mCM.hasActiveBgCall()) { PhoneUtils.hangupHoldingCall(mCM.getFirstActiveBgCall()); } } return new AtCommandResult(AtCommandResult.UNSOLICITED); } });
volumn - up声音大小
// Speaker Gain parser.register("+VGS", new AtCommandHandler() { @Override public AtCommandResult handleSetCommand(Object[] args) { // AT+VGS=<gain> in range [0,15] if (args.length != 1 || !(args[0] instanceof Integer)) { return new AtCommandResult(AtCommandResult.ERROR); } mScoGain = (Integer) args[0]; int flag = mAudioManager.isBluetoothScoOn() ? AudioManager.FLAG_SHOW_UI:0; mAudioManager.setStreamVolume(AudioManager.STREAM_BLUETOOTH_SCO, mScoGain, flag); return new AtCommandResult(AtCommandResult.OK); } });
2)如果是AVRCP按键:
则在,external\bluetooth\bluez\audio\control.c
- /* operands in passthrough commands */
- #define VOL_UP_OP 0x41
- #define VOL_DOWN_OP 0x42
- #define MUTE_OP 0x43
- #define PLAY_OP 0x44
- #define STOP_OP 0x45
- #define PAUSE_OP 0x46
- #define RECORD_OP 0x47
- #define REWIND_OP 0x48
- #define FAST_FORWARD_OP 0x49
- #define EJECT_OP 0x4a
- #define FORWARD_OP 0x4b
- #define BACKWARD_OP 0x4c
- staticstruct{
- constchar*name;
- uint8_t avrcp;
- uint16_t uinput;
- } key_map[]={
- {"PLAY", PLAY_OP, KEY_PLAYCD },
- {"STOP", STOP_OP, KEY_STOPCD },
- {"PAUSE", PAUSE_OP, KEY_PAUSECD },
- {"FORWARD", FORWARD_OP, KEY_NEXTSONG },
- {"BACKWARD", BACKWARD_OP, KEY_PREVIOUSSONG },
- {"REWIND", REWIND_OP, KEY_REWIND },
- {"FAST FORWARD", FAST_FORWARD_OP, KEY_FASTFORWARD },
- { NULL}
- };
- for(i=0; key_map[i].name!= NULL; i++){
- uint8_t key_quirks;
- if((operands[0]&0x7F)!= key_map[i].avrcp)
- continue;
- DBG("AVRCP: %s %s", key_map[i].name, status);
- key_quirks= control->key_quirks[key_map[i].avrcp];
- if(key_quirks& QUIRK_NO_RELEASE){
- if(!pressed){
- DBG("AVRCP: Ignoring release");
- break;
- }
- DBG("AVRCP: treating key press as press + release");
- send_key(control->uinput, key_map[i].uinput,1);
- send_key(control->uinput, key_map[i].uinput,0);
- break;
- }
- send_key(control->uinput, key_map[i].uinput, pressed);
- break;
- }
- staticvoid send_key(int fd, uint16_t key,int pressed)
- {
- if(fd<0)
- return;
- send_event(fd, EV_KEY, key, pressed);
- send_event(fd, EV_SYN, SYN_REPORT,0);
- }