Android5.1蓝牙电话分析及demo

    xiaoxiao2021-04-12  33

    参考: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;

         }

        }

    }

    转载请注明原文地址: https://ju.6miu.com/read-667953.html

    最新回复(0)