共用方式為


來電轉接

在通話當中,您可能想要將通話轉接給另一個人、號碼或語音信箱。 讓我們來了解如何進行。

必要條件

安裝 SDK

使用 npm install 命令,安裝適用於 JavaScript 的 Azure 通訊服務通用和通話 SDK:

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

初始化必要的物件

大部分通話作業都需要 CallClient 執行個體。 當您建立新的 CallClient 執行個體時,您可以使用自訂選項加以設定,如同 Logger 執行個體一樣。

使用 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 console, file, buffer, REST API, or whatever location you want
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()

如何最好地管理與 Microsoft 基礎結構的 SDK 連線

Call Agent 執行個體可協助您管理通話 (加入或啟動通話)。 若要運作,您的通話 SDK 必須連線到 Microsoft 基礎結構以取得來電通知,並協調其他通話詳細資料。 您的 Call Agent 有兩種可能的狀態:

已連線 - ConnectedCall Agent connectionStatue 值表示用戶端 SDK 已連線且能夠接收來自 Microsoft 基礎結構的通知。

已中斷連線 - Disconnected 狀態的 Call Agent connectionStatue 值指出有問題導致 SDK 無法正確連線。 Call Agent 應該重新建立。

  • invalidToken:如果權杖已過期或無效,Call Agent 執行個體會中斷連線,並出現此錯誤。
  • connectionIssue:如果用戶端連線到 Microsoft 基礎結構時發生問題,在多次重試之後,Call Agent 會公開 connectionIssue 錯誤。

您可以藉由檢查 connectionState 屬性的目前值,檢查本機 Call Agent 是否已連線到 Microsoft 基礎結構。 在作用中通話期間,您可以接聽 connectionStateChanged 事件,以判斷 Call Agent 是否從已連線變更為已中斷連線狀態。

const connectionState = callAgentInstance.connectionState;
console.log(connectionState); // it may return either of 'Connected' | 'Disconnected'

const connectionStateCallback = (args) => {
    console.log(args); // it will return an object with oldState and newState, each of having a value of either of 'Connected' | 'Disconnected'
    // it will also return reason, either of 'invalidToken' | 'connectionIssue'
}
callAgentInstance.on('connectionStateChanged', connectionStateCallback);

通話轉接是核心 Call API 的擴充功能。 您必須先從通話 SDK 匯入通話功能:

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

然後,您可以從通話執行個體取得轉接功能 API 物件:

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

通話轉接涉及三方:

  • 轉接者:起始轉接要求的人。
  • 被轉接者:被轉接的人。
  • 轉接目標:轉接給此人。

轉接給參與者:

  1. 「轉接者」與「被轉接者」之間已接通電話。 「轉接者」決定將通話從「被轉接者」轉接給「轉接目標」
  2. 「轉接者」呼叫 transfer API。
  3. 傳輸 目標 會收到來電。

若要轉接目前的通話,您可以使用 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. 傳輸 目標 會收到來電。

若要轉接目前的通話,您可以使用 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 可讓您訂閱 stateChanged。 它也隨附傳輸 stateerror 屬性

// 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

「被轉接者」可以接聽 transferAccepted 事件。 此事件的接聽程式具有 TransferEventArgs,其中包含「被轉接者」與「轉接目標」之間的新轉接呼叫的呼叫物件。

// Transferee can subscribe to the transferAccepted event
callTransferApi.on('transferAccepted', args => {
    const newTransferCall =  args.targetCall;
});

「轉接者」可以訂閱事件,以獲悉轉接狀態的變化。 如果「被轉接者」與「轉接目標」成功接通電話,則「轉接者」可以掛斷與「被轉接者」的原始通話。

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

傳送至語音信箱:

  1. 「轉接者」與「被轉接者」之間有已連線的通話。
  2. 已知目標參與者語音信箱的 Teams 使用者識別碼。
  3. 「轉接者」決定使用目標參與者的 Teams 使用者識別碼,將與「被轉接者」的通話轉移至「目標參與者的語音信箱」
  4. 「轉接者」呼叫 transfer API。
  5. 被轉接者會收到轉接要求。

若要轉接目前的通話,您可以使用 transfer API。

// transfer to the target participant voicemail specified by their Teams User Identifier
const id: MicrosoftTeamsUserIdentifier = { microsoftTeamsUserId: userId}
// call transfer API
const transfer = callTransferApi.transfer({ targetParticipantVoicemail: id });

transfer API 可讓您訂閱 stateChanged。 它也隨附傳輸 stateerror 屬性

// 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

「被轉接者」可以接聽 transferAccepted 事件。 此事件的接聽程式具有 TransferEventArgs,其中包含被轉接者目標參與者語音信箱之間的新來電轉接的呼叫物件。

// Transferee can subscribe to the transferAccepted event
callTransferApi.on('transferAccepted', args => {
    const newTransferCall =  args.targetCall;
});

「轉接者」可以訂閱事件,以獲悉轉接狀態的變化。 如果被轉接者目標參與者語音信箱成功接通電話,則轉接者可以掛斷與被轉接者的原始通話。

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

下一步