蓝牙的key event


上周去某手机公司面试蓝牙方面开发工作,被鄙视了,很多蓝牙底层的东西确实不了解,蓝牙实际项目经验少。

有个关于蓝牙耳机的按键怎么映射到系统里面的问题,刚刚看了一下。

1)如果是HFP按键,

则是耳机是通过AT命令发送到手机侧的。

代码位于BluetoothHandsfree.java

Hang-up 命令:

 // Hang-up command
        parser.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


  1. /* operands in passthrough commands */
  2. #define VOL_UP_OP              0x41
  3. #define VOL_DOWN_OP            0x42
  4. #define MUTE_OP                0x43
  5. #define PLAY_OP                0x44
  6. #define STOP_OP                0x45
  7. #define PAUSE_OP                0x46
  8. #define RECORD_OP              0x47
  9. #define REWIND_OP              0x48
  10. #define FAST_FORWARD_OP        0x49
  11. #define EJECT_OP                0x4a
  12. #define FORWARD_OP              0x4b
  13. #define BACKWARD_OP            0x4c

  1. staticstruct{
  2.        constchar*name;
  3.         uint8_t avrcp;
  4.         uint16_t uinput;
  5. } key_map[]={
  6.        {"PLAY",               PLAY_OP,                KEY_PLAYCD },
  7.        {"STOP",               STOP_OP,                KEY_STOPCD },
  8.        {"PAUSE",              PAUSE_OP,               KEY_PAUSECD },
  9.        {"FORWARD",            FORWARD_OP,             KEY_NEXTSONG },
  10.        {"BACKWARD",           BACKWARD_OP,            KEY_PREVIOUSSONG },
  11.        {"REWIND",             REWIND_OP,              KEY_REWIND },
  12.        {"FAST FORWARD",       FAST_FORWARD_OP,        KEY_FASTFORWARD },
  13.        { NULL}
  14. };
  1.        for(i=0; key_map[i].name!= NULL; i++){
  2.                 uint8_t key_quirks;

  3.                if((operands[0]&0x7F)!= key_map[i].avrcp)
  4.                        continue;

  5.                 DBG("AVRCP: %s %s", key_map[i].name, status);

  6.                 key_quirks= control->key_quirks[key_map[i].avrcp];

  7.                if(key_quirks& QUIRK_NO_RELEASE){
  8.                        if(!pressed){
  9.                                 DBG("AVRCP: Ignoring release");
  10.                                break;
  11.                        }

  12.                         DBG("AVRCP: treating key press as press + release");
  13.                         send_key(control->uinput, key_map[i].uinput,1);
  14.                         send_key(control->uinput, key_map[i].uinput,0);
  15.                        break;
  16.                }

  17.                 send_key(control->uinput, key_map[i].uinput, pressed);
  18.                break;
  19.        }
  1. staticvoid send_key(int fd, uint16_t key,int pressed)
  2. {
  3.        if(fd<0)
  4.                return;

  5.         send_event(fd, EV_KEY, key, pressed);
  6.         send_event(fd, EV_SYN, SYN_REPORT,0);
  7. }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值