HFP Client的设置

380 阅读1分钟

HFP协议

    目前HFP的使用场景有车载蓝牙,耳机和PDA,定义了AG和HFP两种角色。 

    AG(Audio Gate)音频网关—音频设备输入输出网关 
HF(Hands Free)免提—该设备作为音频网关的远程音频输入/输出机制,并可提供若干遥控功能。

    在车载蓝牙中,手机侧是AG,车载蓝牙侧是HF,在android源代码中,将AG侧称为HFP/AG,将HF侧称为HFPClient/HF。

手机侧是HF,耳机侧是HFClient

image.png

HFClient

设备的角色定义为hfp client,需做如下配置:

<bool name="profile_supported_hs_hfp">false</bool>  
<bool name="profile_supported_hfpclient">true</bool>


adb root
adb remount
adb shell setprop persist.vendor.bluetooth.hfp_client true  
adb shell getprop persist.vendor.bluetooth.hfp_client
  • HFP client

    • /frameworks/base/core/java/android/bluetooth/BluetoothHeadsetClient.java

    • /frameworks/base/core/java/android/bluetooth/BluetoothHeadsetClientCall.java

    • /packages/apps/Bluetooth/src/com/android/bluetooth/hfpclient/HeadsetClientHalConstants.java

    • /packages/apps/Bluetooth/src/com/android/bluetooth/hfpclient/HeadsetClientService.java

    • /packages/apps/Bluetooth/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java

    • /packages/apps/Bluetooth/jni/com_android_bluetooth_hfpclient.cpp

    • /hardware/libhardware/include/hardware/bt_hf_client.h

接下来看一下hfp client的实现,以accept call为例
//3步获取hfp client service

1)BluetoothAdapter mAdapter = BluetoothAdapter.getDefaultAdapter();

2)mAdapter.getProfileProxy(getApplicationContext(),new MServerListener(), BluetoothProfile.HEADSET_CLIENT);

3)public class MServerListener implements ServiceListener {  
@Override  
    public void onServiceConnected(int profile, BluetoothProfile proxy) {  
    if (profile == BluetoothProfile.HEADSET_CLIENT) {  
        mclient=(BluetoothHeadsetClient)proxy;  
    .......   
    }  
}

//app获取hfp client service 的proxy之后,就可以直接调用相应的API进行连接控制与call 控制。

e.g.  
mclient.connect( device) //Connects to remote device.  
mclient.connectAudio() //Initiates a connection of audio channel, set up SCO channel  
mclient.acceptCall(device,0);  
mclient.rejectCall(device);  
mclient.terminateCall(device,0);