你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

转移呼叫

重要

本文档中所述的功能目前提供公共预览版。 此预览版在提供时没有附带服务级别协议,不建议将其用于生产工作负荷。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款

在活动呼叫期间,可能需要将呼叫转移到另一个人或号码。 让我们来了解如何操作。

先决条件

安装 SDK

使用 npm install 命令安装适用于 JavaScript 的 Azure 通信服务通话 SDK 和通用 SDK。

npm install @azure/communication-common --save
npm install @azure/communication-calling --save

初始化所需的对象

大多数调用操作都需要 CallClient 实例。 让我们创建新的 CallClient 实例。 可使用自定义选项(例如 Logger 实例)对其进行配置。

有了 CallClient 实例后,你可以通过在 CallClient 实例上调用 createCallAgent 方法来创建 CallAgent 实例。 此方法将异步返回 CallAgent 实例对象。

createCallAgent 方法使用 CommunicationTokenCredential 作为参数。 它接受用户访问令牌

可在 CallClient 实例上使用 getDeviceManager 方法来访问 deviceManager

const { CallClient } = require('@azure/communication-calling');
const { AzureCommunicationTokenCredential} = require('@azure/communication-common');
const { AzureLogger, setLogLevel } = require("@azure/logger");

// Set the logger's log level
setLogLevel('verbose');

// Redirect log output to wherever desired. To console, file, buffer, REST API, etc...
AzureLogger.log = (...args) => {
    console.log(...args); // Redirect log output to console
};

const userToken = '<USER_TOKEN>';
callClient = new CallClient(options);
const tokenCredential = new AzureCommunicationTokenCredential(userToken);
const callAgent = await callClient.createCallAgent(tokenCredential, {displayName: 'optional Azure Communication Services user name'});
const deviceManager = await callClient.getDeviceManager()

注意

此 API 以预览状态提供给开发者,可能根据我们收到的反馈更改。 请勿在生产环境中使用此 API。 若要使用此 API,请使用 Azure 通信服务呼叫 Web SDK 的 beta 版本。

呼叫转移是核心 Call API 的扩展功能。 首先,需要从通话 SDK 导入通话功能:

import { Features} from "@azure/communication-calling";

然后,可从通话实例获取传输功能 API 对象:

const callTransferApi = call.feature(Features.Transfer);

呼叫转移涉及三个参与方:

  • 转移方:发起转移请求的人员。
  • 被转移方:被转移的人员。
  • 转移目标:被转移到的人员。

转移到参与者:

  1. 转移方和被转移方之间已经存在接通的电话。 转移方决定将呼叫从被转移方转移到转移目标。
  2. 转移方调用 transfer API。
  3. 被转移方通过使用 transferRequested 事件来决定是 accept 还是 reject 到转移目标的转移请求。
  4. 只有当被转移方接受转移请求时,转移目标才会收到来电。

若要转移当前呼叫,可以使用 transfer API。 transfer 接受可选的 transferCallOptions,这允许你设置 disableForwardingAndUnanswered 标志:

  • disableForwardingAndUnanswered = false:如果转移目标未接听转移的呼叫,则转移方将遵循转移目标的转发设置和未接听设置。
  • disableForwardingAndUnanswered = true:如果转移目标未接听转移的呼叫,则转移尝试结束。
// transfer target can be an Azure Communication Services user
const id = { communicationUserId: <ACS_USER_ID> };
// call transfer API
const transfer = callTransferApi.transfer({targetParticipant: id});

转移到呼叫:

  1. 转移方和被转移方之间已经存在接通的电话。
  2. 转移方和转移目标之间已经存在接通的电话。
  3. 转移方决定将呼叫从被转移方转移到转移目标。
  4. 转移方调用 transfer API。
  5. 被转移方通过使用 transferRequested 事件来决定是 accept 还是 reject 到转移目标的转移请求。
  6. 只有当被转移方接受转移请求时,转移目标才会收到来电。

若要转移当前呼叫,可以使用 transfer API。

// transfer to the target call specifying the call id
const id = { targetCallId: <CALL_ID> };
// call transfer API
const transfer = callTransferApi.transfer({ targetCallId: <CALL_ID> });

transfer API 允许你订阅 transferStateChangedtransferRequested 事件。 transferRequested 事件来自 call 实例;transferStateChanged 事件与转移 stateerror 来自 transfer 实例。

// transfer state
const transferState = transfer.state; // None | Transferring | Transferred | Failed

// to check the transfer failure reason
const transferError = transfer.error; // transfer error code that describes the failure if a transfer request failed

被转移方可以通过在 transferRequestedEventArgs 中使用 accept()reject() 来接受或拒绝转移方在 transferRequested 事件中发起的转移请求。 你可以在 transferRequestedEventArgs 中访问 targetParticipant 信息和 acceptreject 方法。

// Transferee to accept the transfer request
callTransferApi.on('transferRequested', args => {
    args.accept();
});

// Transferee to reject the transfer request
callTransferApi.on('transferRequested', args => {
    args.reject();
});

转移方可以订阅转移状态更改事件。 如果对被转移方的呼叫已成功与转移目标连接,则转移方可以挂断对被转移方的原始呼叫。

transfer.on('stateChanged', () => {
   if (transfer.state === 'Transferred') {
       call.hangUp();
   }
});

后续步骤