Android 4.3 蓝牙基础篇之 HFP

  • HFP 简单介绍

定义:HFP (Hands-free Profile),让蓝牙设备(如蓝牙耳机)可以控制电话,如接听、挂断、拒接、语音拨号等,拒接、语音拨号要看蓝牙设备是否支持。

 
HFP定义了音频网关(AG)和免提组件(HF)两个角色: 
音频网关(AG) –该设备为音频(特别是手机)的输入/输出网关。 
免提组件(HF) –该设备作为音频网关的远程音频输入/输出机制,并可提供若干遥控功能。

  • 简单操作流程

1.初始化

private void initBluetooth() {
        mBtAdapter = BluetoothAdapter.getDefaultAdapter();
        if (!mBtAdapter.isEnabled()) {
            return;
        }
        //获取Hfp代理对象
        mBtAdapter.getProfileProxy(mContext, mListener, BluetoothProfile.HEADSET);
    }

    private void initReceiver() {
        //广播接收者监听状态
        IntentFilter filter = new IntentFilter(BluetoothHeadset.
                ACTION_CONNECTION_STATE_CHANGED);
        mContext.registerReceiver(mReceiver, filter);
    }

2.连接监听回调

  private BluetoothProfile.ServiceListener mListener = new BluetoothProfile.ServiceListener() {
        @Override
        public void onServiceDisconnected(int profile) {
            Log.i(TAG, "onServiceDisconnected profile=" + profile);
            if (profile == BluetoothProfile.HEADSET) {
                mHeadset = null;
            }
        }

        @Override
        public void onServiceConnected(int profile, BluetoothProfile proxy) {
            Log.i(TAG, "hfp onServiceConnected  profile=" + profile);
            if (profile == BluetoothProfile.HEADSET) {
                mHeadset = (BluetoothHeadset) proxy; //转换
                if (onBluetoothHfpReadyListener != null) {
                    onBluetoothHfpReadyListener.onBluetoothHfpReady();
                }
            }
        }
    };

3.连接

   public void connectHfp(BluetoothDevice device) {
        Log.i(TAG, "connect to device :" + device);
        mConnectDevice = device;
        setPriority(device, 100); //设置priority
        try {
            //通过反射获取 BluetoothHfp 中 connect 方法(hide的),进行连接。
            Method connectMethod = BluetoothHeadset.class.getMethod("connect",
                    BluetoothDevice.class);
            connectMethod.invoke(mHeadset, device);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

4.断开连接

  public void disConnectHfp(BluetoothDevice device) {
        setPriority(device, 0);
        try {
            //通过反射获取BluetoothHfp中connect方法(hide的),断开连接。
            Method connectMethod = BluetoothHeadset.class.getMethod("disconnect",
                    BluetoothDevice.class);
            connectMethod.invoke(mHeadset, device);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

5.设置 priority 级别,一般定义 100 为好

 public void setPriority(BluetoothDevice device, int priority) {
        if (mHeadset == null) return;
        try {//通过反射获取BluetoothHfp中setPriority方法(hide的),设置优先级
            Method connectMethod = BluetoothHeadset.class.getMethod("setPriority",
                    BluetoothDevice.class, int.class);
            connectMethod.invoke(mHeadset, device, priority);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 

HFP 具体的基础连接、设置已经介绍完了。

好了,在结尾分享下我在做蓝牙音响开发时总结的一点东西,做蓝牙音箱时,需要到录音功能,这时需要连接 HFP ,然后切换 SCO 链路( 之前有分享)进行手机录音,然后录音完成之后,需要把 SCO 链路切换回来。让 A2DP 进行音乐的播放或者是语音播报等等。所以才需要进行 HFP 连接。当然有些蓝牙设备是有回连机制,这样就需要我们在初始化的时候做判断(骚操作),有可能会获取到设备对象的。

未完待续,不断更新!

 

 

 

 

 

 

 

 

 


 

 

 

 

 

你可能感兴趣的:(Android 4.3 蓝牙基础篇之 HFP)