Поделиться через


Управление вестибюлем собраний в Teams

Внимание

Эта функция Службы коммуникации Azure сейчас доступна в предварительной версии. Функции в предварительной версии общедоступны и могут использоваться всеми новыми и существующими клиентами Майкрософт.

Эта предварительная версия предоставляется без соглашения об уровне обслуживания. Ее не следует использовать для производственных рабочих нагрузок. Некоторые функции могут не поддерживаться или могут быть ограничены.

Дополнительные сведения см. в дополнительных условиях использования для предварительных версий Microsoft Azure.

Внимание

Эта функция Службы коммуникации Azure сейчас доступна в предварительной версии. Функции в предварительной версии общедоступны и могут использоваться всеми новыми и существующими клиентами Майкрософт.

Эта предварительная версия предоставляется без соглашения об уровне обслуживания. Ее не следует использовать для производственных рабочих нагрузок. Некоторые функции могут не поддерживаться или могут быть ограничены.

Дополнительные сведения см. в дополнительных условиях использования для предварительных версий Microsoft Azure.

Внимание

Эта функция Службы коммуникации Azure сейчас доступна в предварительной версии. Функции в предварительной версии общедоступны и могут использоваться всеми новыми и существующими клиентами Майкрософт.

Эта предварительная версия предоставляется без соглашения об уровне обслуживания. Ее не следует использовать для производственных рабочих нагрузок. Некоторые функции могут не поддерживаться или могут быть ограничены.

Дополнительные сведения см. в дополнительных условиях использования для предварительных версий Microsoft Azure.

В этой статье описывается, как реализовать возможность использования вестибюля для собраний Teams с помощью SDK для вызовов службы коммуникации Azure. Эта возможность позволяет пользователям принимать и отклонять участников в зале ожидания Teams, получать уведомление о присоединении к залу ожидания и получать список участников зала ожидания.

Предварительные условия

Пользователь попадает в лобби в зависимости от конфигурации Microsoft Teams. Элементы управления описаны в разделе "Дополнительные сведения о конфигурации Teams ".

Пользователи Служб коммуникации Microsoft 365 или Azure могут признать или отклонить пользователей из лобби, если они подключены к собранию Teams и имеют роль организатора, соорганизатора или докладчика. Узнайте больше о ролях на собраниях.

Чтобы обновить или проверить текущие политики присоединения к собранию и лобби в Центре администрирования Teams, см. дополнительные сведения о политиках Teams.

Поддержка

В следующих таблицах определяется поддержка лобби в пакете SDK для вызовов служб коммуникации Azure.

Идентичности и типы вызовов

Идентичности Совещание в "Teams" Комната Личный разговор 1:1 Групповой звонок Вызов для взаимодействия команд в режиме 1:1 Вызов взаимодействия в группах Teams
пользователь Служб связи ✔️
Пользователь Microsoft 365 ✔️

Операции

Возможности "Лобби пакета SDK для вызовов" поддерживают следующие операции API как для служб коммуникации, так и для пользователей Microsoft 365.

Операции пользователь Служб связи Пользователь Microsoft 365
признавать ✔️* ✔️*
отклонять ✔️* ✔️*
разрешитьВсе ✔️* ✔️*
getParticipants ✔️ ✔️
обновленыУчастникиЛобби ✔️ ✔️

Пакеты SDK

Способность Интернет Веб-интерфейс iOS Пользовательский интерфейс iOS Андроид Пользовательский интерфейс Android Виндоус
Поддерживается ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

* Только пользователь служб коммуникации и пользователь Microsoft 365 назначил роль организатора, соорганизатора или докладчика.

Внимание

Примеры доступны в версии 1.15.1-beta.1 пакета SDK для JavaScript. Не забудьте использовать эту версию или более новую, выполняя это краткое руководство.

Установка пакета SDK

npm install Используйте команду для установки пакета SDK Службы коммуникации Azure Common and Calling SDK для JavaScript:

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

Инициализация обязательных объектов

Экземпляр CallClient необходим для большинства операций вызова. При создании нового экземпляра CallClient вы можете настроить его, используя такие пользовательские параметры, как экземпляр Logger.

С помощью экземпляра CallClient вы можете создать экземпляр CallAgent, вызвав createCallAgent. Этот метод асинхронно возвращает объект экземпляра CallAgent.

Метод createCallAgent использует CommunicationTokenCredential в качестве аргумента. Он принимает маркер доступа пользователя.

Можно применить метод getDeviceManager для экземпляра CallClient, чтобы получить доступ к 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 к инфраструктуре Майкрософт

Экземпляр Call Agent помогает управлять вызовами (для присоединения или запуска вызовов). Для работы пакета SDK для вызова необходимо подключиться к инфраструктуре Майкрософт для получения уведомлений о входящих звонках и координации других сведений о вызове. У вашего Call Agent два возможных состояния:

ПодключеноCall Agent значение Connected connectionStatue означает, что клиентский пакет SDK подключен и способен получать уведомления из инфраструктуры Майкрософт.

ОтключеноCall Agent значение connectionStatue из Disconnected указывает на проблему, которая мешает правильному подключению SDK. Call Agent необходимо повторно создать.

  • invalidToken: если срок действия токена истек или он недействителен, Call Agent экземпляр отключается с этой ошибкой.
  • connectionIssue: если у клиента возникла проблема с подключением к инфраструктуре Майкрософт, после многочисленных повторных попыток Call Agent возникает connectionIssue ошибка.

Вы можете проверить, подключен ли локальный сервер Call Agent к инфраструктуре Майкрософт, проверив текущее значение connectionState свойства. Во время активного вызова вы можете прослушивать событие 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);

Объект Lobby, на классе Call или TeamsCall, позволяет пользователям получать доступ к информации о лобби для собраний Teams. Он включает API, admit, reject и admitAll, позволяющие пользователю допустить или отклонить участников из лобби собрания в Teams. Пользователь также может получить коллекцию participants и подписаться на lobbyParticipantsUpdated событие для получения уведомления.

Получение объекта лобби

Первое, что нужно сделать, — это получить объект Call или TeamsCall от допускающего: Узнайте, как присоединиться к собранию в Teams. Объект можно получить Lobby из Call или TeamsCall объекта.

const lobby = call.lobby;

Получение свойств участников лобби

Чтобы узнать, кто находится в лобби, вы можете получить коллекцию participants из Lobby объекта. Это коллекция RemoteParticipant объекта с InLobby состоянием. Чтобы получить коллекцию participants , выполните следующие действия.

let lobbyParticipants = lobby.participants; // [remoteParticipant, remoteParticipant....]

Получение идентификатора удаленного участника

Перед признанием или отклонением участника из лобби можно получить идентификатор удаленного участника:

if(lobbyParticipants.length !== 0){
    let remoteParticipant = lobbyParticipants[0];
}
//You could get the identifier from the Lobby.participants collection
//You could also get the identifier from the lobbyParticipantsUpdated event
const identifier = remoteParticipant.identifier;

Это identifier может быть один из следующих CommunicationIdentifier типов:

  • { communicationUserId: '<COMMUNICATION_SERVICES_USER_ID'> }: объект, представляющий пользователя Службы коммуникации Azure.
  • { phoneNumber: '<PHONE_NUMBER>' }: объект, представляющий номер телефона в формате E.164.
  • { microsoftTeamsUserId: '<MICROSOFT_TEAMS_USER_ID>', isAnonymous?: boolean; cloud?: "public" | "dod" | "gcch" }: объект, представляющий пользователя Teams.
  • { id: string }: объект, представляющий идентификатор, который не соответствует ни одному из других типов идентификаторов.

Прием, отклонение и признание участника из лобби

Чтобы впустить, отклонить или впустить всех пользователей из лобби, можно использовать методы admit, reject и admitAll. Асинхронные API могут использоваться прослушивателями для проверки результатов lobbyParticipantsUpdated.

Вы можете допустить или отклонить в лобби, вызвав методы admit и reject. Метод принимает идентификаторы MicrosoftTeamsUserIdentifier, CommunicationUserIdentifier, PhoneNumberIdentifier или UnknownIdentifier в качестве входных данных. Вы также можете допустить всех пользователей из лобби, вызвав метод admitAll.

//admit
await lobby.admit(identifier);
//reject
await lobby.reject(identifier);
//admitAll
await lobby.admitAll();

Обработка события обновления лобби

Вы можете подписаться на событие lobbyParticipantsUpdated для обработки изменений в коллекции participants. Это событие будет активировано при добавлении или удалении участников из лобби, и он предоставит добавленный или удаленный список участников.

subscribeToCall = (call) => {
    try {
        //Subscribe to lobby's 'lobbyParticipantsUpdated' event for lobbyParticipants update.
        call.lobby.on('lobbyParticipantsUpdated', lobbyParticipantsUpdatedHandler);
    } catch (error) {
        console.error(error);
    }
}

const lobbyParticipantsUpdatedHandler = (event) => {
    event.added.forEach(remoteParticipant => {
        console.log(`${remoteParticipant._displayName} joins the lobby`);
    });
    event.removed.forEach(remoteParticipant => {
        console.log(`${remoteParticipant._displayName} leaves the lobby`);
    })
};

Дополнительные сведения о событиях и подписке

Установка пакета SDK

Найдите файл build.gradle на уровне проекта и добавьте mavenCentral() в список репозиториев в разделах buildscript и allprojects:

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

Затем в файле вашего модуля build.gradle добавьте следующие строки в раздел dependencies:

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

Инициализируйте требуемые объекты

Чтобы создать CallAgent экземпляр, необходимо вызвать метод createCallAgent на экземпляре CallClient. Этот вызов асинхронно возвращает объект экземпляра 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();

Объект CallLobby, на классе Call или TeamsCall, позволяет пользователям получать доступ к информации о лобби для собраний Teams. Он включает API, admit, reject и admitAll, позволяющие пользователю допустить или отклонить участников из лобби собрания в Teams. Пользователь также может получить коллекцию participants и подписаться на addOnLobbyParticipantsUpdatedListener прослушиватель событий для получения уведомлений.

Получение объекта CallLobby

Первое — это получить объект CallLobby из экземпляра вызова.

private CallLobby callLobby;
callLobby = call.getCallLobby();

Получение свойств участников лобби

Чтобы узнать, кто находится в лобби, вы можете получить коллекцию participants из CallLobby объекта. Это коллекция RemoteParticipant объекта с InLobby состоянием. Чтобы получить коллекцию participants , выполните следующие действия.

List<RemoteParticipant> lobbyParticipants = callLobby.getParticipants(); 

Получение идентификатора удаленного участника

Прежде чем признать или отклонить участника из лобби, необходимо получить идентификатор удаленного участника:

//You could get the identifier from the lobby participants collection
//You could also get the identifier from the addOnLobbyParticipantsUpdatedListener event
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>"));

Допустить участника из CallLobby

Объект CallLobby позволяет пользователю с ролью организатора, докладчика и соорганизатора допустить участников из Teams CallLobby. Метод admit принимает коллекцию идентификаторов в качестве входных данных и возвращает AdmitParticipantsResult объект в результате.

AdmitParticipantsResult result = this.callLobby.admit(identifiers).get();
String failedParticipants = this.convertListToString("", result.getFailedParticipants());
Log.i(LOBBY_TAG, String.format("Admit result: success count: %s, failure count: %s, failure participants: %s", admitResult.getSuccessCount(), failedParticipants.length(), failedParticipants));

Отклонение участника из CallLobby

Объект MeetingLobby позволяет пользователю с ролью организатора, соорганизатора и докладчика отклонять участников из Teams MeetingLobby. Метод reject принимает идентификатор в качестве входных данных.

//To reject all participants from CallLobby:
for (CommunicationIdentifier identifier : identifiers)
{
    this.callLobby.reject(lobbyParticipantsIdentifiers.get(0)).get();
}

Допустить всех участников из CallLobby

Объект MeetingLobby позволяет пользователю с ролью организатора, соорганизатора и докладчика признать всех участников из Teams MeetingLobby. Метод admitAll возвращает AdmitAllParticipantsResult объект в результате.

AdmitAllParticipantsResult result = this.callLobby.admitAll().get();
Log.i(LOBBY_TAG, String.format("Admit result: success count: %s, failure count: %s, failure participants: %s", result.getSuccessCount(), result.getFailureCount()));

Обработка обновленного события CallLobby

Вы можете подписаться на addOnLobbyParticipantsUpdatedListener прослушиватель событий для обработки изменений в participants коллекции. Это событие активируется при добавлении или удалении участников из CallLobby и предоставляет добавленный или удаленный список участников.

//To register listener:
this.callLobby.addOnLobbyParticipantsUpdatedListener(this::OnLobbyParticipantsUpdated);

private void OnLobbyParticipantsUpdated(ParticipantsUpdatedEvent args) {
    if(!args.getAddedParticipants().isEmpty()){
        for(RemoteParticipant addedParticipant : args.getAddedParticipants()){
            Log.i(TAG, String.format("Participant %s joins lobby", addedParticipant.getDisplayName()));
        }
    }

    if(!args.getRemovedParticipants().isEmpty()){
        for(RemoteParticipant removedParticipant : args.getRemovedParticipants()){
            Log.i(TAG, String.format("Participant %s leaves lobby", removedParticipant.getDisplayName()));
        }
    }
}

//To unregister listener:
lobby.removeOnLobbyParticipantsUpdatedListener(this::OnLobbyParticipantsUpdated);

Дополнительные сведения о событиях и подписке

Настройка системы

Выполните следующие действия, чтобы настроить систему.

Создайте проект 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. Откройте .xcworkspace с помощью Xcode.

Запрос доступа к микрофону

Чтобы получить доступ к микрофону устройства, необходимо обновить список свойств приложения с помощью 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

Чтобы создать экземпляр CallAgent из CallClient, необходимо использовать метод 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")
        }
})

Объект CallLobby, на классе Call или TeamsCall, позволяет пользователям получать доступ к информации о лобби для собраний Teams. Он включает API, admit, reject и admitAll, позволяющие пользователю допустить или отклонить участников из лобби собрания в Teams. Пользователь также может получить коллекцию participants и подключить прослушиватель событий, чтобы получать уведомления.

Получение объекта CallLobby

Первое — это получить объект CallLobby из экземпляра вызова.

@State var callLobby: CallLobby?
callLobby = self.call!.callLobby

Получение свойств участников лобби

Чтобы узнать, кто находится в лобби, вы можете получить коллекцию participants из CallLobby объекта. Это коллекция RemoteParticipant объекта с InLobby состоянием. Чтобы получить коллекцию participants , выполните следующие действия.

let lobbyParticipants = callLobby.participants

Получение идентификатора удаленного участника

Прежде чем признать или отклонить участника из CallLobby, необходимо получить идентификатор удаленного участника:

//You could get the identifier from the lobby participants collection
//You could also get the identifier from the addOnLobbyParticipantsUpdatedListener event
let identifiers = (call?.callLobby.participants.map {$0.identifier})!;

Допустить участника из CallLobby

Объект CallLobby позволяет пользователю с ролью организатора, докладчика и соорганизатора допустить участников из Teams CallLobby. Метод admit принимает коллекцию идентификаторов в качестве входных данных и возвращает AdmitParticipantsResult объект в результате.

callLobby.admit(identifiers: identifiers, completionHandler: { result, error in
    if error != nil {
        print ("Admit participant is failed %@", error! as Error)
    } else{
        print ("Admit result. success count: %s , failure count: %s, failure participants: %s", result.successCount, result.failureCount, result.failureParticipants)
    }
})

Отклонение участника из CallLobby

Объект CallLobby позволяет пользователю с ролью организатора, соорганизатора и докладчика отклонять участников из Teams CallLobby. Метод reject принимает идентификатор.

//To reject participant from CallLobby:
callLobby.reject(identifiers.first!, completionHandler: { error in
    if error != nil {
        print ("Reject all participants is failed %@", error! as Error)
    }
})

Допустить всех участников из CallLobby

Объект CallLobby позволяет пользователю с ролью организатора, соорганизатора и докладчика признать всех участников из Teams CallLobby. Метод admitAll возвращает AdmitAllParticipantsResult объект в результате.

callLobby.admitAll(completionHandler: { result, error in
    if error != nil {
        print ("Admit all participants is failed %@", error! as Error)
    } else{
        print ("AdmitAll result. success count: %s , failure count: %s", result.successCount, result.failureCount)
    }
})

Обработка обновленного события CallLobby

Вы можете подписаться на прослушиватель событий для обработки изменений в participants коллекции. Это событие активируется при добавлении или удалении участников из CallLobby и предоставляет добавленный или удаленный список участников.

//To register listener:
self.callObserver = CallObserver(view:self)

callLobby = self.call!.callLobby
callLobby!.delegate = self.callObserver

public class CallObserver : NSObject, CallLobbyDelegate
{
    public func callLobby(_ callLobby: CallLobby, didUpdateLobbyParticipants args: ParticipantsUpdatedEventArgs) {
        args.removedParticipants.forEach { p in
            let mri = Utilities.toMri(p.identifier)
            os_log("==>Participants %d is removed from the lobby.", log:log, mri)
        }

        args.addedParticipants.forEach { p in
            let mri = Utilities.toMri(p.identifier)
            os_log("==>Participants %d is added to the lobby.", log:log, mri)
        }
    }
}    

//To unregister listener, you can use the `off` method.
self.callLobby?.delegate = nil

Дополнительные сведения о событиях и подписке

Настройка системы

Выполните следующие действия, чтобы настроить систему.

Создание проекта Visual Studio

В Visual Studio 2022 для приложения универсальной платформы Windows создайте новый проект Пустое приложение (универсальная платформа Windows). После ввода имени проекта вы можете выбрать любой пакет SDK для Windows позже 10.0.17763.0.

Для приложения WinUI 3 создайте новый проект с шаблоном "Пустое приложение", упакованное (WinUI 3 в настольном ПК) для создания одностраничного приложения WinUI 3. Требуется пакет SDK для приложений Windows версии 1.3 или более поздней.

Установите пакет и зависимости с помощью диспетчера пакетов NuGet.

API и библиотеки для вызовов в составе SDK доступны через публичный пакет NuGet.

Чтобы найти, скачать и установить пакет NuGet SDK для вызовов:

  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. Выберите "Установить".

Объект CallLobby, на классе Call или TeamsCall, позволяет пользователям получать доступ к информации о лобби для собраний Teams. Он включает API, AdmitAsync, RejectAsync и AdmitAllAsync, позволяющие пользователю допустить или отклонить участников из лобби собрания в Teams. Пользователь также может получить коллекцию Participants и подписаться на LobbyParticipantsUpdated событие для получения уведомления.

Получение объекта CallLobby

Первое — это получить объект CallLobby из экземпляра вызова.

private CallLobby callLobby;
callLobby = call.CallLobby;

Получение свойств участников лобби

Чтобы узнать, кто находится в лобби, вы можете получить коллекцию Participants из CallLobby объекта. Это коллекция RemoteParticipant объекта с InLobby состоянием. Чтобы получить коллекцию Participants , выполните следующие действия.

var lobbyParticipants = callLobby.Participants; 

Получение идентификатора удаленного участника

Прежде чем признать или отклонить участника из CallLobby, необходимо получить идентификатор удаленного участника:

//You could get the identifier from the CallLobby.Participants collection
//You could also get the identifier from the LobbyParticipantsUpdated event
var identifiers = lobbyParticipants.Select(p => p.Identifier).ToList().AsReadOnly();

Допустить участника из CallLobby

Объект CallLobby позволяет пользователю с ролью организатора, докладчика и соорганизатора допустить участников из Teams CallLobby. Метод AdmitAsync принимает коллекцию идентификаторов в качестве входных данных и возвращает AdmitParticipantsResult объект в результате.

AdmitParticipantsResult result = await callLobby?.AdmitAsync(identifiers);
Trace.WriteLine("Admit result. success count: " + result.SuccessCount + ", failure count: " + result.FailedParticipants.Count + ", failure participants: " + result.FailedParticipants);
foreach (RemoteParticipant participant in result.FailureParticipants.ToList<RemoteParticipant>())
{
    Trace.WriteLine("Admit participant: " + participant.DisplayName + " failed ");
}

Отклонение участника из CallLobby

Объект CallLobby позволяет пользователю с ролью организатора, соорганизатора и докладчика отклонять участников из Teams CallLobby. Метод RejectAsync принимает идентификатор в качестве входных данных.

//To reject all participants from CallLobby:
foreach (CallIdentifier identifier in identifiers)
{
    await callLobby?.RejectAsync(identifier);
}

Допустить всех участников из CallLobby

Объект CallLobby позволяет пользователю с ролью организатора, соорганизатора и докладчика признать всех участников из Teams CallLobby. Метод AdmitAllAsync возвращает AdmitAllParticipantsResult объект в результате.

AdmitAllParticipantsResult result = await callLobby?.AdmitAllAsync();
Trace.WriteLine("Admit all result. success count: " + result.SuccessCount + ", failure count: " + result.FailureCount);

Обработка обновленного события CallLobby

Вы можете подписаться на событие LobbyParticipantsUpdated для обработки изменений в коллекции Participants. Это событие активируется при добавлении или удалении участников из CallLobby и предоставляет добавленный или удаленный список участников.

//When call.State == CallState.Connected
callLobby.LobbyParticipantsUpdated += CallLobby_OnLobbyParticipantsUpdated;

private async void CallLobby_OnLobbyParticipantsUpdated(object sender, ParticipantsUpdatedEventArgs args)
{
    foreach (var remoteParticipant in args.AddedParticipants.ToList<RemoteParticipant>()){
        Trace.WriteLine("Participant: " + participant.DisplayName + " joins lobby ");
    }

    foreach (var remoteParticipant in args.RemovedParticipants.ToList<RemoteParticipant>()){
        Trace.WriteLine("Participant: " + participant.DisplayName + " leaves lobby ");
    }
}

Дополнительные сведения о событиях и подписке

Следующие шаги