1.重要目录及文件
1.manager
frameworks/base/core/java/android/bluetooth/BluetoothHeadsetClient.java
frameworks/base/core/java/android/bluetooth/IBluetoothHeadsetClient.aidl
2.Bluethooth.apk
packages/apps/Bluetooth/src/com/android/bluetooth/hfp //蓝牙电话服务(免提)
packages/apps/Bluetooth/src/com/android/bluetooth/hfpclient //蓝牙耳机服务
packages/apps/Bluetooth/res/values/config.xml //蓝牙协议配置文件,想用哪个配置为true即可
packages/apps/Bluetooth/src/com/android/bluetooth/btservice/Config.java //读取蓝牙协议xml配置文件
packages/apps/Bluetooth/src/com/android/bluetooth/btservice/AdapterService.java //启动蓝牙等服务
3.service
//manager跨进程调用HeadsetClientStateMachine服务
packages/apps/Bluetooth/src/com/android/bluetooth/hfpclient/HeadsetClientService.java
//HeadsetClientStateMachine服务通过jni调用C/C++通信
packages/apps/Bluetooth/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java
4.hal
external/bluetooth/bluedroid/btif/src/bluetooth.c
struct hw_module_t HAL_MODULE_INFO_SYM = {
.id = BT_HARDWARE_MODULE_ID,
.methods = &bt_stack_module_methods
};
5.kernel
kernel/net/rfkill/rfkill.c
module_init(rfkill_xx_init); |
2.蓝牙耳机服务:HeadsetClientService的connect()调用流程
<1>frameworks/base/core/java/android/bluetooth/BluetoothHeadsetClient.java
privateIBluetoothHeadsetClientmService;
publicbooleanconnect(BluetoothDevicedevice) {
return mService.connect(device);
}
<2>packages/apps/Bluetooth/src/com/android/bluetooth/hfpclient/HeadsetClientService.java
import android.bluetooth.IBluetoothHeadsetClient;
import android.bluetooth.BluetoothHeadsetClient;
private static class BluetoothHeadsetClientBinder extendsIBluetoothHeadsetClient.Stub implementsIProfileServiceBinder {
private HeadsetClientService mService;
public BluetoothHeadsetClientBinder(HeadsetClientService svc) {
mService = svc;//HeadsetClientService svc
}
private HeadsetClientService getService() {
return mService;//mService = svc
}
@Override
public boolean connect(BluetoothDevice device) {
HeadsetClientService service = getService();
return service.connect(device);//HeadsetClientService service
}}
public boolean connect(BluetoothDevice device) {
mStateMachine.sendMessage(HeadsetClientStateMachine.CONNECT, device);//发送消息:CONNECT
return true;
}
<3>packages/apps/Bluetooth/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java
private native booleanconnectNative(byte[] address);
@Override
public synchronized boolean processMessage(Message message){
switch (message.what){
case CONNECT:
if (!connectNative(getByteAddress(device))){
...
}
}
}
<4>packages/apps/Bluetooth/jni/com_android_bluetooth_hfpclient.cpp
static jbooleanconnectNative(JNIEnv *env, jobject object, jbyteArray address) {
status =sBluetoothHfpClientInterface->connect((bt_bdaddr_t *)addr)
}
<5>external/bluetooth/bluedroid/btif/src/btif_hf_client.c
static const bthf_client_interface_t bthfClientInterface = {
sizeof(bthf_client_interface_t),
.init = init,
.connect =connect,
...
}
<5>kernel/net/rfkill/input.c
static struct input_handler rfkill_handler = {
...
.connect =rfkill_connect,
};
3.拨打电话demoprivate BluetoothHeadsetClient mHfpClient;
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
bluetoothAdapter.getProfileProxy(this, mHandsFreeServiceListener, BluetoothProfile.HEADSET_CLIENT);
private BluetoothProfile.ServiceListener mHandsFreeServiceListener = new BluetoothProfile.ServiceListener(){
@Override
public void onServiceConnected(int profile, BluetoothProfile proxy) {
if(profile == BluetoothProfile.HEADSET_CLIENT){
Log.e(TAG,"HEADSET_CLIENT proxy ========= "+ String.valueOf(proxy));
mHfpClient = (BluetoothHeadsetClient)proxy;
List<BluetoothDevice> devices = mHfpClient.getConnectedDevices();
for(BluetoothDevice device : devices){
mHfpClient.dial(device_test,"10086");//拨号
}
}
}
@Override
public void onServiceDisconnected(int profile){
if (profile == BluetoothProfile.HEADSET_CLIENT)) {
mHfpClient = null;
}
}
}