DEV Community

HarmonyOS
HarmonyOS

Posted on

Bluetooth HFP Support for Third-Party Device Phone Calls

Read the original article:Bluetooth HFP Support for Third-Party Device Phone Calls

Context

Developers frequently ask whether HarmonyOS supports answering phone calls through third-party Bluetooth devices and what interface capabilities are available for this functionality.

Description

HarmonyOS provides comprehensive support for handling phone calls through Bluetooth-connected third-party devices using the Hands-Free Profile (HFP). The system includes dedicated APIs and protocols that enable seamless voice interaction between HarmonyOS devices and compatible Bluetooth accessories like headsets, car audio systems, and other hands-free devices.

The HFP protocol defines standardized processes for voice interaction between devices with two distinct roles:

  • AG (Audio Gateway): The audio source device responsible for audio transmission, contact information sending, and call control
  • HF (Hands-Free): The audio receiving/output device that handles user operations

Solution / Approach

1. Verify Device HFP Protocol Support

First, confirm that the target device supports the HFP protocol. Use the hfp.createHfpAgProfile method to create a HandsFreeAudioGatewayProfile instance and connect to the corresponding profile.

2. Implementation Steps

The Bluetooth development process follows these stages:

  • Device discovery
  • Device pairing and connection
  • Data connection and transmission

3. Code Implementation

import { connection, hfp, baseProfile, constant } from '@kit.ConnectivityKit';
import { BusinessError } from '@kit.BasicServicesKit';

export class PairDeviceManager {
  device: string = '';
  pairState: connection.BondState = connection.BondState.BOND_STATE_INVALID;
  hfpAg = hfp.createHfpAgProfile();

  // Define pairing state change callback function
  onBondStateEvent = (data: connection.BondStateParam) => {
    if (data && data.deviceId == this.device) {
      this.pairState = data.state; // Save target device pairing state
    }
  };

  // Initiate pairing, device address can be obtained through device discovery process
  public startPair(device: string) {
    this.device = device;
    try {
      // Subscribe to pairing state change events
      connection.on('bondStateChange', this.onBondStateEvent);
    } catch (err) {
      console.error('bondStateChange errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
    }

    try {
      // Initiate pairing
      connection.pairDevice(device).then(() => {
        console.info('pairDevice');
      }, (error: BusinessError) => {
        console.error('pairDevice: errCode:' + error.code + ',errMessage' + error.message);
      });
    } catch (err) {
      console.error('startPair: errCode:' + err.code + ',errMessage' + err.message);
    }
  }

  // Define HFP connection state change callback function
  onHfpConnectStateChange = (data: baseProfile.StateChangeParam) => {
    // Handle HFP connection state changes
  };

  // Initiate connection
  public async connect(device: string) {
    try {
      let uuids = await connection.getRemoteProfileUuids(device);
      let allowedProfiles = 0;
      if (uuids.some(uuid => uuid == constant.ProfileUuids.PROFILE_UUID_HFP_HF.toLowerCase())) {
        console.info('device supports hfp');
        allowedProfiles++;
        this.hfpAg.on('connectionStateChange', this.onHfpConnectStateChange);
      }
      if (allowedProfiles > 0) { // If available profiles exist, initiate connection
        connection.connectAllowedProfiles(device).then(() => {
          console.info('connectAllowedProfiles');
        }, (error: BusinessError) => {
          console.error('errCode:' + error.code + ',errMessage' + error.message);
        });
      }
    } catch (err) {
      console.error('errCode:' + err.code + ',errMessage' + err.message);
    }
  }
}

let pairDeviceManager = new PairDeviceManager();
export default pairDeviceManager as PairDeviceManager;
Enter fullscreen mode Exit fullscreen mode

Key Takeaways

  • HarmonyOS fully supports Bluetooth HFP protocol for third-party device phone call handling
  • The HFP module provides comprehensive APIs for Bluetooth call interface access
  • Device compatibility verification is essential before establishing HFP connections
  • Proper error handling and state management are crucial for reliable Bluetooth communication
  • The implementation requires following the standard Bluetooth development workflow: discovery, pairing, and connection

Additional Resources

Written by Emincan Ozcan

Top comments (0)