Share via


Call Automation を使用して既存の通話に Microsoft Teams ユーザーを追加する

このクイックスタートでは、Azure Communication Services Call Automation API を使用して、Teams ユーザーに対して通話を追加、削除、転送します。

前提条件

  • アクティブなサブスクリプションが含まれる Azure アカウント。
  • Microsoft Teams Phone ライセンスと、管理者特権を持つ Teams テナント。 Teams Phone ライセンスはこの機能を使用するために必須です。Teams ライセンスの詳細については、こちらを参照してください。 Microsoft Teams ユーザーも voice を有効にする必要があります。「setting-up-your-phone-system」を参照してください。 管理者特権は、Teams ユーザーへの通話を Communication Services リソースに認可するために必要です。これについては手順 1 で後から説明します。
  • デプロイされた Communication Service リソースと、Azure portal の左側のメニューで [キー] を選択して検出された有効な接続文字列。
  • Communication Service リソースから PSTN 電話番号を取得する。 このクイックスタートで使用するために取得した電話番号をメモしてください。
  • IncomingCall イベントを受信するための Azure Event Grid サブスクリプション。
  • お使いのオペレーティング システムに応じた最新の Azure Communication Service Call Automation API ライブラリ
  • Call Automation API ライブラリを実装する Web サービス。このチュートリアルに従ってください。

手順 1: Microsoft Teams ユーザーへの通話を可能にするための Azure Communication Services リソースの認可

Call Automation API を通じた通話を可能にするには、Microsoft Teams 管理者またはグローバル管理者は明示的に、Communication Services リソースのそのテナントへのアクセスを有効にして通話を許可できるようにする必要があります。

テナントと特定の Communication Services リソースとのフェデレーションを有効/無効にする Set-CsTeamsAcsFederationConfiguration (MicrosoftTeamsPowerShell) テナント レベルの設定。

Set-CsExternalAccessPolicy (SkypeForBusiness) ユーザー ポリシーを使用すると、管理者は、組織内のどのユーザーが Communication Services ユーザーとのフェデレーション通信に参加できるかをさらに制御できます。

この機能を使用するには、Teams ユーザーが電話ライセンスを持っている必要があることに注意してください。 ライセンスを割り当てるには、Set-CsPhoneNumberAssignment コマンドレット を使用し、EnterpriseVoiceEnabled パラメータを $true に設定します。 詳細については、「組織で Teams Phone を設定する」を参照してください。

手順 2: Graph API を使用して、Teams ユーザーの Microsoft Entra オブジェクト ID を取得し、必要に応じてユーザーのプレゼンスを確認する

Teams ユーザーの Microsoft Entra オブジェクト ID (OID) は、Communication Services の通話に対してユーザーを追加したり転送したりするために必要です。 OID は、1) Office ポータル、2) Microsoft Entra 管理センター、3) Microsoft Entra Connect、または 4) Graph API を通じて取得できます。 以下の例では Graph API 使用しています。

Graph を使用してユーザーを検索するには、その前に Microsoft Entra 管理者が同意している必要があります。詳細については、「Microsoft Graph Security API の概要」を参照してください。 OID は、List users API を使用してユーザーを検索することにより取得できます。 次に、表示名による検索を示しますが、他のプロパティも検索できます。

Microsoft Graph v1.0 を使用してユーザーを一覧表示する:

Request:
	https://graph.microsoft.com/v1.0/users?$search="displayName:Art Anderson"
Permissions:
	Application and delegated. Refer to documentation.
Response:
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users",
    "value": [
        {
            "displayName": "Art Anderson",
            "mail": "artanderson@contoso.com",
            "id": "fc4ccb5f-8046-4812-803f-6c344a5d1560"
        }

必要に応じて、プレゼンス取得 API とユーザー ObjectId を使用して、ユーザーのプレゼンスを取得できます。 詳細は、Microsoft Graph v1.0 のドキュメントを参照してください。

Request:
https://graph.microsoft.com/v1.0/users/fc4ccb5f-8046-4812-803f-6c344a5d1560/presence
Permissions:
Delegated only. Application not supported.  Refer to documentation.
Response:
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('fc4ccb5f-8046-4812-803f-6c344a5d1560')/presence/$entity",
    "id": "fc4ccb5f-8046-4812-803f-6c344a5d1560",
    "availability": "Offline",
    "activity": "Offline"

手順 3: Call Automation API によって制御される既存の Communication Services 通話に Teams ユーザーを追加する

事前に必要な手順をすべて終え、Communication Services の通話を制御する Web サービス アプリを用意しておく必要があります。 callConnection オブジェクトを使用して、通話に参加者を追加します。

CallAutomationClient client = new CallAutomationClient('<Connection_String>');
AnswerCallResult answer = await client.AnswerCallAsync(incomingCallContext, new Uri('<Callback_URI>'));
await answer.Value.CallConnection.AddParticipantAsync(
    new CallInvite(new MicrosoftTeamsUserIdentifier('<Teams_User_Guid>'))
    {
        SourceDisplayName = "Jack (Contoso Tech Support)"
    });
CallAutomationClient client = new CallAutomationClientBuilder().connectionString("<resource_connection_string>").buildClient();
AnswerCallResult answer = client.answerCall(incomingCallContext, "<Callback_URI>"));
answer.getCallConnection().addParticipant(
    new CallInvite(new MicrosoftTeamsUserIdentifier("<Teams_User_Guid>"))
        .setSourceDisplayName("Jack (Contoso Tech Support)"));
const client = new CallAutomationClient("<resource_connection_string>");
const answer = await client.answerCall(incomingCallContext, "<Callback_URI>"));
answer.callConnection.addParticipant({
    targetParticipant: { microsoftTeamsUserId: "<Teams_User_Guid>" },
    sourceDisplayName: "Jack (Contoso Tech Support)"
});
call_automation_client = CallAutomationClient.from_connection_string("<resource_connection_string>")
answer = call_automation_client.answer_call(incoming_call_context = incoming_call_context, callback_url = "<Callback_URI>")
call_connection_client = call_automation_client.get_call_connection(answer.call_connection_id)
call_connection_client.add_participant(target_participant = CallInvite(
    target = MicrosoftTeamsUserIdentifier(user_id="<USER_ID>"),
    source_display_name = "Jack (Contoso Tech Support)"))

Microsoft Teams デスクトップ クライアントで、Jack の通話は、着信トースト通知を通じて Microsoft Teams ユーザーに送信されます。

Microsoft Teams デスクトップ クライアントのスクリーンショット。Jack の通話は、着信トースト通知を通じて Microsoft Teams ユーザーに送信されます。

Microsoft Teams ユーザーが通話を受け入れると、Microsoft Teams ユーザーの通話内エクスペリエンスにより、すべての参加者が Microsoft Teams 名簿に表示されます。 Call Automation API を使用して通話を管理しているアプリケーションは、通話画面で Teams ユーザーに対して非表示のままであることに注意してください (ただし、Teams ユーザーとの 1 対 1 の通話を開始する場合を除く)。
Microsoft Teams ユーザーが通話を受け、Microsoft Teams ユーザーの通話内エクスペリエンスを入力しているスクリーンショット。

手順 4: Call Automation API によって制御される既存の Communication Services 通話から Teams ユーザーを削除する

await answer.Value.CallConnection.RemoveParticipantAsync(new MicrosoftTeamsUserIdentifier('<Teams_User_Guid>'));
answer.getCallConnection().removeParticipant(new MicrosoftTeamsUserIdentifier("<Teams_User_Guid>"));
answer.callConnection.removeParticipant({ microsoftTeamsUserId: "<Teams_User_Guid>" });
call_connection_client.remove_participant(target_participant = MicrosoftTeamsUserIdentifier(user_id="<USER_ID>"))

オプション機能: Call Automation API によって制御される既存の Communication Services 通話を Teams ユーザーに転送する

await answer.Value.CallConnection.TransferCallToParticipantAsync(new MicrosoftTeamsUserIdentifier('<Teams_User_Guid>'));
answer.getCallConnection().transferCallToParticipant(new MicrosoftTeamsUserIdentifier("<Teams_User_Guid>"));
answer.callConnection.transferCallToParticipant({ microsoftTeamsUserId: "<Teams_User_Guid>" });
call_connection_client.transfer_call_to_participant(target_participant = MicrosoftTeamsUserIdentifier(user_id = "<USER_ID>"))

リソースをクリーンアップする

Communication Services サブスクリプションをクリーンアップして解除する場合は、リソースまたはリソース グループを削除できます。 リソース グループを削除すると、それに関連付けられている他のリソースも削除されます。 詳細については、リソースのクリーンアップに関する記事を参照してください。

次のステップ