1

在这里,我尝试使用蓝牙经典连接两个 android 设备并通过 HFP 配置文件转移呼叫。

如果设备A有来电,我需要通知设备B并从设备B侧接受/拒绝,甚至需要从设备B侧通话。

我已经从蓝牙配置中的源端进行了更改,以启用设备 B 中 HFP 配置文件的 A2DP 接收器和 HF 角色(禁用的 AG 角色)。

我对 AT 命令的工作原理感到困惑。我必须通过输出流(蓝牙经典连接)传递 AT 命令。

仅通过 AT 命令(根据 HFP 文档)来接受呼叫是否足够,或者我是否必须根据收到的 AT 命令在设备 B 端处理呼叫?我正在为这项工作创建一个应用程序。

如果通过 AT 命令接受呼叫,或者我是否必须从应用程序级别手动为此执行某些操作,呼叫也会自动通过连接流式传输?

4

1 回答 1

1

Android 框架为 HFP 提供了很好的支持。

  1. AG角色:蓝牙耳机。大多数手机充当AG角色,手机应用会调用BluetoothHeadset API充当AG角色。默认情况下启用此配置文件。
  2. HF 角色:BluetoothHeadsetClient。此 API 已隐藏,第三方应用无法使用。对于大多数手机,没有任何应用程序可以作为 HF 角色处理。所以你需要开发一个APP来做到这一点。和安卓汽车一样,它可以充当HF角色来连接手机。AOSP CarSystemUI有一个例子。默认情况下禁用此配置文件。您应该通过覆盖profile_supported_hfpclient来启用此配置文件。

至于如何扮演 HF 角色:

  • 连接到 HFP 配置文件,获取 BluetoothHeadsetClient:

    private BluetoothHeadsetClient mBluetoothHeadsetClient;
    private final ServiceListener mHfpServiceListener = new ServiceListener() {
        @Override
        public void onServiceConnected(int profile, BluetoothProfile proxy) {
            if (profile == BluetoothProfile.HEADSET_CLIENT) {
                mBluetoothHeadsetClient = (BluetoothHeadsetClient) proxy;
            }
        }

        @Override
        public void onServiceDisconnected(int profile) {
            if (profile == BluetoothProfile.HEADSET_CLIENT) {
                mBluetoothHeadsetClient = null;
            }
        }
    };

   mAdapter.getProfileProxy(context.getApplicationContext(), mHfpServiceListener,
     BluetoothProfile.HEADSET_CLIENT);

  • 连接到远程设备:
   mBluetoothHeadsetClient.connect(remoteDevice)
  • 监控连接状态、调用变化、ag事件:
   IntentFilter filter = new IntentFilter();
   filter.addAction(BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED);
   filter.addAction(BluetoothHeadsetClient.ACTION_AG_EVENT);
        mContext.registerReceiver(this, filter);
   filter.addAction(BluetoothHeadsetClient.ACTION_CALL_CHANGED);
        mContext.registerReceiver(this, filter);
  • 触发呼叫、接听呼叫或发送供应商 AT 命令:
   mBluetoothHeadsetClient.dail
   mBluetoothHeadsetClient.acceptCall
   mBluetoothHeadsetClient.sendVendorAtCommand

Android 提供高级 API,您无需发送 AT 命令即可接受调用。

于 2021-08-11T01:58:15.020 回答