Android5.1蓝牙电话分析及demo

参考:android源码蓝牙协议分析

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.拨打电话demo

private 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;

     }

    }

}











评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Android系统攻城狮

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值