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

举手状态

重要

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

重要

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

重要

本文中所述的功能目前以公共预览版提供。 此预览版在提供时没有附带服务级别协议,我们不建议将其用于生产工作负荷。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 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 实例后,可以通过调用 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()

如何最好地管理 SDK 与 Microsoft 基础结构的连接性

Call Agent 实例可帮助你管理通话(以加入或启动通话)。 通话 SDK 需要连接到 Microsoft 基础结构以获取传入通话通知并协调其他通话详细信息,否则无法工作。 你的 Call Agent 有两种可能的状态:

已连接 - Call Agent connectionStatue 值为 Connected 表示客户端 SDK 已连接,能够接收来自 Microsoft 基础结构的通知。

已断开连接 - Call Agent connectionStatue 值为 Disconnected 表示存在阻止 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);

“举手”功能允许通话中的参与者指示他们有问题、评论或疑问,而不会中断演讲者或其他参与者。 此功能可用于任何通话类型(包括一对一通话和具有多个参与者的通话)、Azure 通信服务和 Teams 通话。 首先,需要从通话 SDK 导入通话功能:

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

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

const raiseHandFeature = call.feature(Features.RaiseHand );

举起或放下当前参与者的手:

若要更改当前参与者的举手状态,可以使用 raiseHand()lowerHand() 方法。 这是异步方法,用于验证 raisedHandChangedloweredHandChanged 侦听器是否可以使用结果。

const raiseHandFeature = call.feature(Features.RaiseHand );
//raise
raiseHandFeature.raiseHand();
//lower
raiseHandFeature.lowerHand();

放下其他参与者的手

此功能允许具有组织者和演示者角色的用户放下 Teams 通话中其他参与者所举的手。 在 Azure 通信通话中,除非添加了角色,否则不允许更改其他参与者的状态。

若要使用此功能,可以使用以下代码:

const raiseHandFeature = call.feature(Features.RaiseHand );
//lower all hands on the call
raiseHandFeature.lowerAllHands();
//or we can provide array of CommunicationIdentifier to specify list of participants
CommunicationUserIdentifier acsUser = new CommunicationUserIdentifier(<USER_ID>);
MicrosoftTeamsUserIdentifier teamsUser = new MicrosoftTeamsUserIdentifier(<USER_ID>)
CommunicationIdentifier participants[] = new CommunicationIdentifier[]{ acsUser, teamsUser };
raiseHandFeature.lowerHands(participants);

处理已更改状态

使用举手 API,可以订阅 raisedHandChangedloweredHandChanged 事件,以处理通话中参与者状态的更改。 这些事件由调用实例触发,并提供有关其状态已更改的参与者的信息。

若要订阅这些事件,可以使用以下代码:

const raiseHandFeature = call.feature(Features.RaiseHand );

// event : {identifier: CommunicationIdentifier}
const raisedHandChangedHandler = (event) => {
    console.log(`Participant ${event.identifier} raised hand`);
};
const loweredHandChangedHandler = (event) => {
    console.log(`Participant ${event.identifier} lowered hand`);
};
raiseHandFeature.on('raisedHandEvent', raisedHandChangedHandler):
raiseHandFeature.on('loweredHandEvent', loweredHandChangedHandler):

raisedHandChangedloweredHandChanged 事件包含一个具有 identifier 属性的对象,该对象表示参与者的通信标识符。 在上面的示例中,我们将一条消息记录到控制台,指示参与者已举手。

若要取消订阅事件,可以使用 off 方法。

具有活动状态的所有参与者列表

若要获取有关当前通话中具有举手状态的所有参与者的信息,可以使用 getRaisedHands API。 返回的数组按顺序字段排序。 以下示例呈现了如何使用该 getRaisedHands API:

const raiseHandFeature = call.feature(Features.RaiseHand );
let participantsWithRaisedHands = raiseHandFeature.getRaisedHands();

举手顺序

participantsWithRaisedHands 变量将包含一组参与者对象,其中每个对象具有以下属性:identifier:参与者的通信标识符;order:参与者举手的顺序。你可以使用此信息显示具有举手状态的参与者列表及其在队列中的顺序。

安装 SDK

找到项目级别的 build.gradle 文件,并将 mavenCentral() 添加到 buildscriptallprojects 下的存储库列表中

buildscript {
    repositories {
    ...
        mavenCentral()
    ...
    }
}
allprojects {
    repositories {
    ...
        mavenCentral()
    ...
    }
}

然后,在模块级别的 build.gradle 文件中,将以下行添加到 dependencies 部分

dependencies {
    ...
    implementation 'com.azure.android:azure-communication-calling:1.0.0'
    ...
}

初始化所需的对象

若要创建 CallAgent 实例,必须对 CallClient 实例调用 createCallAgent 方法。 此调用将异步返回 CallAgent 实例对象。

createCallAgent 方法采用 CommunicationUserCredential 作为参数来封装访问令牌

若要访问 DeviceManager,必须先创建 callAgent 实例。 然后,可以使用 CallClient.getDeviceManager 方法获取 DeviceManager

String userToken = '<user token>';
CallClient callClient = new CallClient();
CommunicationTokenCredential tokenCredential = new CommunicationTokenCredential(userToken);
android.content.Context appContext = this.getApplicationContext(); // From within an activity, for instance
CallAgent callAgent = callClient.createCallAgent(appContext, tokenCredential).get();
DeviceManager deviceManager = callClient.getDeviceManager(appContext).get();

若要为主叫方设置显示名称,请使用以下替代方法:

String userToken = '<user token>';
CallClient callClient = new CallClient();
CommunicationTokenCredential tokenCredential = new CommunicationTokenCredential(userToken);
android.content.Context appContext = this.getApplicationContext(); // From within an activity, for instance
CallAgentOptions callAgentOptions = new CallAgentOptions();
callAgentOptions.setDisplayName("Alice Bob");
DeviceManager deviceManager = callClient.getDeviceManager(appContext).get();
CallAgent callAgent = callClient.createCallAgent(appContext, tokenCredential, callAgentOptions).get();

“举手”功能允许通话中的参与者指示他们有问题、评论或疑问,而不会中断演讲者或其他参与者。 此功能可用于任何通话类型(包括一对一通话和具有多个参与者的通话)、Azure 通信服务和 Teams 通话。 首先,需要从通话 SDK 导入通话功能:

import com.azure.android.communication.calling.RaiseHandFeature;

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

RaiseHandFeature raiseHandFeature = call.feature(Features.RAISE_HAND);

举起或放下当前参与者的手:

若要更改当前参与者的举手状态,可以使用 raiseHand()lowerHand() 方法。 这是异步方法,用于验证 RaisedHandReceivedLoweredHandReceived 侦听器是否可以使用结果。

RaiseHandFeature raiseHandFeature = call.feature(Features.RAISE_HAND);
//raise
raiseHandFeature.raiseHand();
//lower
raiseHandFeature.lowerHand();

放下其他参与者的手

此功能允许具有组织者和演示者角色的用户放下 Teams 通话中其他参与者所举的手。 在 Azure 通信通话中,除非添加了角色,否则不允许更改其他参与者的状态。

若要使用此功能,可以使用以下代码:

RaiseHandFeature raiseHandFeature = call.feature(Features.RAISE_HAND);
//lower all hands on the call
raiseHandFeature.lowerAllHands();
//or we can provide array of CommunicationIdentifier to specify list of participants
List<CommunicationIdentifier> identifiers = new ArrayList<>();
CommunicationUserIdentifier acsUser = new CommunicationUserIdentifier(<USER_ID>);
MicrosoftTeamsUserIdentifier teamsUser = new MicrosoftTeamsUserIdentifier(<USER_ID>);
identifiers.add(new CommunicationUserIdentifier("<USER_ID>"));
identifiers.add(new MicrosoftTeamsUserIdentifier("<USER_ID>"));
raiseHandFeature.lowerHands(identifiers);

处理已更改状态

使用举手 API,可以订阅 RaisedHandReceivedLoweredHandReceived 事件,以处理通话中参与者状态的更改。 这些事件由调用实例触发,并提供有关其状态已更改的参与者的信息。

若要订阅这些事件,可以使用以下代码:

RaiseHandFeature raiseHandFeature = call.feature(Features.RAISE_HAND)

// event example : {identifier: CommunicationIdentifier, isRaised: true, order:1}
call.feature(Features.RAISE_HAND).addOnRaisedHandReceivedListener(raiseHandEvent -> {
    Log.i(TAG, String.format("Raise Hand: %s : %s", Utilities.toMRI(raiseHandEvent.getIdentifier()), raiseHandEvent.isRaised()));
});

RaisedHandReceivedLoweredHandReceived 事件包含一个具有 identifier 属性的对象,该对象表示参与者的通信标识符。 在上面的示例中,我们将一条消息记录到控制台,指示参与者已举手。

若要取消订阅事件,可以使用 off 方法。

具有活动状态的所有参与者列表

若要获取有关当前通话中具有举手状态的所有参与者的信息,可以使用 getRaisedHands API。 返回的数组按顺序字段排序。 以下示例呈现了如何使用该 getRaisedHands API:

RaiseHandFeature raiseHandFeature = call.feature(Features.RAISE_HAND);
List<RaiseHand> participantsWithRaisedHands = raiseHandFeature.getRaisedHands();

举手顺序

participantsWithRaisedHands 变量将包含一组参与者对象,其中每个对象具有以下属性:identifier:参与者的通信标识符;order:参与者举手的顺序。你可以使用此信息显示具有举手状态的参与者列表及其在队列中的顺序。

设置系统

创建 Xcode 项目

在 Xcode 中,创建新的 iOS 项目,并选择“单视图应用”模板。 本快速入门使用 SwiftUI 框架,因此应将“语言”设置为“Swift”,并将“接口”设置为“SwiftUI”

在此快速入门过程中,无需创建测试。 请随意清除“包括测试”复选框

显示用于在 Xcode 中创建项目的窗口的屏幕截图。

使用 CocoaPods 安装包和依赖项

  1. 为应用程序创建 Podfile,如此示例所示:

    platform :ios, '13.0'
    use_frameworks!
    target 'AzureCommunicationCallingSample' do
        pod 'AzureCommunicationCalling', '~> 1.0.0'
    end
    
  2. 运行 pod install

  3. 使用 Xcode 打开 .xcworkspace

请求访问麦克风

若要访问设备的麦克风,需要使用 NSMicrophoneUsageDescription 更新应用的信息属性列表。 将关联的值设置为将要包含在系统用于向用户请求访问权限的对话框中的字符串。

右键单击项目树的 Info.plist 条目,然后选择“打开为...”>“源代码”。 将以下代码行添加到顶层 <dict> 节,然后保存文件。

<key>NSMicrophoneUsageDescription</key>
<string>Need microphone access for VOIP calling.</string>

设置应用框架

打开项目的 ContentView.swift 文件。 将 import 声明添加到文件顶部以导入 AzureCommunicationCalling 库。 此外,导入 AVFoundation。 你将需要用它来处理代码中的音频权限请求。

import AzureCommunicationCalling
import AVFoundation

初始化 CallAgent

若要从 CallClient 创建 CallAgent 实例,必须使用 callClient.createCallAgent 方法,该方法在初始化后异步返回 CallAgent 对象。

若要创建通话客户端,请传递 CommunicationTokenCredential 对象:

import AzureCommunication

let tokenString = "token_string"
var userCredential: CommunicationTokenCredential?
do {
    let options = CommunicationTokenRefreshOptions(initialToken: token, refreshProactively: true, tokenRefresher: self.fetchTokenSync)
    userCredential = try CommunicationTokenCredential(withOptions: options)
} catch {
    updates("Couldn't created Credential object", false)
    initializationDispatchGroup!.leave()
    return
}

// tokenProvider needs to be implemented by Contoso, which fetches a new token
public func fetchTokenSync(then onCompletion: TokenRefreshOnCompletion) {
    let newToken = self.tokenProvider!.fetchNewToken()
    onCompletion(newToken, nil)
}

将创建的 CommunicationTokenCredential 对象传递给 CallClient 并设置显示名称:

self.callClient = CallClient()
let callAgentOptions = CallAgentOptions()
options.displayName = " iOS Azure Communication Services User"

self.callClient!.createCallAgent(userCredential: userCredential!,
    options: callAgentOptions) { (callAgent, error) in
        if error == nil {
            print("Create agent succeeded")
            self.callAgent = callAgent
        } else {
            print("Create agent failed")
        }
})

“举手”功能允许通话中的参与者指示他们有问题、评论或疑问,而不会中断演讲者或其他参与者。 此功能可用于任何通话类型(包括一对一通话和具有多个参与者的通话)、Azure 通信服务和 Teams 通话。 首先,需要从通话 SDK 导入通话功能:

import AzureCommunicationCalling

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

@State var raisehandFeature: RaiseHandCallFeature?

raiseHandFeature = self.call!.feature(Features.raiseHand)

举起或放下当前参与者的手:

若要更改当前参与者的举手状态,可以使用 raiseHand()lowerHand() 方法。

//publish raise hand state for local participant
raisehandFeature.raiseHand(completionHandler: { (error) in
    if let error = error {
        print ("Feature failed raise a hand %@", error as Error)
    }
})

//remove raise hand state for local participant
raisehandFeature.lowerHand(completionHandler: { (error) in
    if let error = error {
        print ("Feature failed lower hand %@", error as Error)
    }
})

放下其他参与者的手

此功能允许具有组织者和演示者角色的用户放下 Teams 通话中其他参与者所举的手。 在 Azure 通信通话中,除非添加了角色,否则不允许更改其他参与者的状态。

若要使用此功能,可以使用以下代码:


// remove raise hand states for all participants on the call
raisehandFeature.lowerAllHands(completionHandler: { (error) in
    if let error = error {
        print ("Feature failed lower all hands %@", error as Error)
    }
})

// remove raise hand states for all remote participants on the call
let identifiers = (call?.remoteParticipants.map {$0.identifier})!;
raisehandFeature.lowerHands(participants: identifiers, completionHandler: { (error) in
    if let error = error {
        print ("Feature failed lower hands %@", error as Error)
    }
})

// remove raise hand state of specific user
var identifiers : [CommunicationIdentifier] = []
identifiers.append(CommunicationUserIdentifier("<USER_ID>"))
raisehandFeature.lowerHands(participants: identifiers, completionHandler: { (error) in
    if let error = error {
        print ("Feature failed lower hands %@", error as Error)
    }
})

处理已更改状态

使用举手 API,可以订阅 RaisedHandReceivedLoweredHandReceived 事件,以处理通话中参与者状态的更改。 这些事件由调用实例触发,并提供有关其状态已更改的参与者的信息。

若要订阅这些事件,可以使用以下代码:

self.callObserver = CallObserver(view:self)

raisehandFeature = self.call!.feature(Features.raiseHand)
raisehandFeature!.delegate = self.callObserver

public class CallObserver : NSObject, RaiseHandCallFeatureDelegate
{
    // event example : {identifier: CommunicationIdentifier}
    public func raiseHandCallFeature(_ raiseHandCallFeature: RaiseHandCallFeature, didReceiveRaisedHand args: RaisedHandChangedEventArgs) {
        os_log("Raise hand feature updated: %s is raised hand", log:log, Utilities.toMri(args.identifier))
        raiseHandCallFeature.raisedHands.forEach { raiseHand in
            os_log("Raise hand active: %s", log:log, Utilities.toMri(raiseHand.identifier))
        }
    }
    public func raiseHandCallFeature(_ raiseHandCallFeature: RaiseHandCallFeature, didReceiveLoweredHand args: LoweredHandChangedEventArgs) {
        os_log("Raise hand feature updated: %s is lowered hand", log:log, Utilities.toMri(args.identifier))
        raiseHandCallFeature.raisedHands.forEach { raiseHand in
            os_log("Raise hand active: %s", log:log, Utilities.toMri(raiseHand.identifier))
        }
    }
}    

RaisedHandReceivedLoweredHandReceived 事件包含一个具有 identifier 属性的对象,该对象表示参与者的通信标识符。 在上面的示例中,我们将一条消息记录到控制台,指示参与者已举手。

若要取消订阅事件,可以使用 off 方法。

具有活动状态的所有参与者列表

若要获取有关当前通话中具有举手状态的所有参与者的信息,可以使用 getRaisedHands API。 返回的数组按顺序字段排序。 以下示例呈现了如何使用该 raisedHands API:

raisehandFeature = self.call!.feature(Features.raiseHand)
raisehandFeature.raisedHands.forEach { raiseHand in
    os_log("Raise hand active: %s", log:log, Utilities.toMri(raiseHand.identifier))
}

举手顺序

raisedHands 变量将包含一组参与者对象,其中每个对象具有以下属性:identifier:参与者的通信标识符;order:参与者举手的顺序。你可以使用此信息显示具有举手状态的参与者列表及其在队列中的顺序。

设置系统

创建 Visual Studio 项目

对于 UWP 应用,请在 Visual Studio 2022 中创建新的“空白应用(通用 Windows)”项目。 输入项目名称后,可随意选择任何版本高于 10.0.17763.0 的 Windows SDK。

对于 WinUI 3 应用,请使用“已打包空白应用(桌面中的 WinUI 3)”模板创建新项目,以设置单页 WinUI 3 应用。 需要 Windows App SDK 版本 1.3 或更高版本。

使用 NuGet 包管理器安装包和依赖项

可通过 NuGet 包公开提供通话 SDK API 和库。

以下步骤举例说明了如何查找、下载和安装通话 SDK NuGet 包:

  1. 选择“工具”>“NuGet 包管理器”>“管理解决方案的 NuGet 包”,以打开 NuGet 包管理器
  2. 选择“浏览”,然后在搜索框中输入 Azure.Communication.Calling.WindowsClient
  3. 确保已选中“包括预发行版”复选框
  4. 选择 Azure.Communication.Calling.WindowsClient 包,然后选择 Azure.Communication.Calling.WindowsClient1.4.0-beta.1 或更高版本。
  5. 在右侧选项卡上选中与 Azure 通信服务项目对应的复选框。
  6. 选择“安装”按钮。

“举手”功能允许通话中的参与者指示他们有问题、评论或疑问,而不会中断演讲者或其他参与者。 此功能可用于任何通话类型(包括一对一通话和具有多个参与者的通话)、Azure 通信服务和 Teams 通话。 首先,需要从通话 SDK 导入通话功能:

using Azure.Communication.Calling.WindowsClient;

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

private RaiseHandCallFeature raiseHandCallFeature;

raiseHandCallFeature = (RaiseHandCallFeature)call.GetCallFeatureExtension(CallFeatureType.RaiseHand);

举起或放下当前参与者的手:

若要更改当前参与者的举手状态,可以使用 raiseHand()lowerHand() 方法。 这是异步方法,用于验证 RaisedHandReceivedLoweredhandReceived 侦听器是否可以使用结果。

//publish raise hand state for local participant
raiseHandCallFeature.RaiseHandAsync();

//remove raise hand state for local participant
raiseHandCallFeature.LowerHandAsync();

放下其他参与者的手

此功能允许具有组织者和演示者角色的用户放下 Teams 通话中其他参与者所举的手。 在 Azure 通信通话中,除非添加了角色,否则不允许更改其他参与者的状态。

若要使用此功能,可以使用以下代码:


// remove raise hand states for all participants on the call
raiseHandCallFeature.LowerAllHandsAsync();

// remove raise hand states for all remote participants on the call
var participants = call.RemoteParticipants;
var identifiers = participants.Select(p => p.Identifier).ToList().AsReadOnly();
raiseHandCallFeature.LowerHandsAsync(identifiers);

// remove raise hand state of specific user
var identifiers = new List<CallIdentifier>();
identifiers.Add(new UserCallIdentifier("USER_ID"));
raiseHandCallFeature.LowerHandsAsync(identifiers);

处理已更改状态

使用举手 API,可以订阅 RaisedHandReceivedLoweredHandReceived 事件,以处理通话中参与者状态的更改。 这些事件由调用实例触发,并提供有关其状态已更改的参与者的信息。

若要订阅这些事件,可以使用以下代码:

raiseHandCallFeature = (RaiseHandCallFeature)call.GetCallFeatureExtension(CallFeatureType.RaiseHand);
raiseHandCallFeature.RaisedHandReceived += OnRaisedHandChange;
raiseHandCallFeature.LoweredHandReceived += OnLoweredHandChange;

private async void OnRaisedHandChange(object sender, RaisedHandChangedEventArgs args)
{
    Trace.WriteLine("RaiseHandEvent: participant " + args.Identifier + " is raised hand");
}

private async void OnLoweredHandChange(object sender, RaisedHandChangedEventArgs args)
{
    Trace.WriteLine("RaiseHandEvent: participant " + args.Identifier + " is lowered hand");
}

RaisedHandReceivedLoweredHandReceived 事件包含一个具有 identifier 属性的对象,该对象表示参与者的通信标识符。 在上面的示例中,我们将一条消息记录到控制台,指示参与者已举手。

若要取消订阅事件,可以使用 off 方法。

具有活动状态的所有参与者列表

若要获取有关当前通话中具有举手状态的所有参与者的信息,可以使用 getRaisedHands API。 返回的数组按顺序字段排序。 以下示例呈现了如何使用该 RaisedHands API:

raiseHandCallFeature = (RaiseHandCallFeature)call.GetCallFeatureExtension(CallFeatureType.RaiseHand);
foreach (RaiseHand rh in raiseHandCallFeature.RaisedHands.ToList())
{
    Trace.WriteLine("Participant " + rh.Identifier.RawId + " has raised hand ");
}

举手顺序

RaisedHands 变量将包含一组参与者对象,其中每个对象具有以下属性:identifier:参与者的通信标识符;order:参与者举手的顺序。你可以使用此信息显示具有举手状态的参与者列表及其在队列中的顺序。

有关在 Teams 通话和会议中使用“举手”功能的详细信息,请参阅 Microsoft Teams 文档

后续步骤