Бөлісу құралы:


Управление записью вызовов на клиенте

Внимание

Функции, описанные в этой статье, в настоящее время находятся в общедоступной предварительной версии. Эта предварительная версия предоставляется без соглашения об уровне обслуживания. Ее не следует использовать для производственных рабочих нагрузок. Некоторые функции могут не поддерживаться или их возможности могут быть ограничены. Дополнительные сведения см. в статье Дополнительные условия использования Предварительных версий Microsoft Azure.

Запись звонков позволяет пользователям записывать вызовы, которые они выполняют с помощью Службы коммуникации Azure. Из этой статьи вы узнаете, как управлять записью на стороне клиента. Перед началом работы необходимо настроить запись на стороне сервера.

Необходимые компоненты

Установка пакета 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);

Примечание.

Этот API предоставляется в качестве предварительной версии для разработчиков и может измениться на основе полученных отзывов. Не используйте этот API в рабочей среде. Чтобы использовать этот API, используйте бета-версию Службы коммуникации Azure вызывающего веб-пакета SDK.

Облачная запись

Запись вызовов является расширенной функцией базового API вызовов. Сначала необходимо импортировать функции вызова из пакета SDK для вызовов:

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

Затем можно получить объект API функций записи из экземпляра вызова:

const callRecordingApi = call.feature(Features.Recording);

Чтобы проверить, записывается ли вызов, проверьте isRecordingActive свойство callRecordingApi. Он возвращает Boolean.

const isRecordingActive = callRecordingApi.isRecordingActive;

Вы также можете подписаться на запись изменений:

const isRecordingActiveChangedHandler = () => {
    console.log(callRecordingApi.isRecordingActive);
};

callRecordingApi.on('isRecordingActiveChanged', isRecordingActiveChangedHandler);

Список записей можно получить с помощью recordings свойства callRecordingApi. RecordingInfo[]Возвращается, что имеет текущее состояние облачной записи.

const recordings = callRecordingApi.recordings;

recordings.forEach(r => {
    console.log("State: ${r.state}");

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

const cloudRecordingsUpdatedHandler = (args: { added: SDK.RecordingInfo[], removed: SDK.RecordingInfo[]}) => {
                        console.log('Recording started by: ');
                        args.added?.forEach(a => {
                            console.log('State: ${a.state}');
                        });

                        console.log('Recording stopped by: ');
                        args.removed?.forEach(r => {
                            console.log('State: ${r.state}');
                        });
                    };
callRecordingApi.on('recordingsUpdated', cloudRecordingsUpdatedHandler );

Установка пакета 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();

Запись вызовов

Примечание.

Этот API предоставляется в качестве предварительной версии для разработчиков и может измениться на основе полученных отзывов. Не используйте этот API в рабочей среде. Чтобы использовать этот API, используйте бета-версию пакета SDK для Службы коммуникации Azure вызова Android.

Запись вызовов — это расширенная функция основного Call объекта.

Предупреждение

До версии 1.1.0 и бета-версии версии 1.1.0-beta.1 пакета SDK isRecordingActive для android для вызова Службы коммуникации Azure и addOnIsRecordingActiveChangedListener были частью Call объекта. Для новых бета-версий эти API были перенесены как расширенная функция Call.

Сначала необходимо получить объект функции записи:

RecordingCallFeature callRecordingFeature = call.feature(Features.RECORDING);

Затем вы можете убедиться, что вызов записывается, проверив свойство isRecordingActive объекта callRecordingFeature. Он возвращает boolean.

boolean isRecordingActive = callRecordingFeature.isRecordingActive();

Вы также можете подписаться на запись изменений:

private void handleCallOnIsRecordingChanged(PropertyChangedEvent args) {
  boolean isRecordingActive = callRecordingFeature.isRecordingActive();
}

callRecordingFeature.addOnIsRecordingActiveChangedListener(handleCallOnIsRecordingChanged);

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

После настройки записи звонков на сервере из приложения Android необходимо получить ServerCallId значение из вызова, а затем отправить его на сервер, чтобы начать процесс записи. Значение можно найти ServerCallId с помощью getServerCallId() CallInfo класса. Класс можно найти в объекте CallInfo класса с помощью getInfo().

try {
    String serverCallId = call.getInfo().getServerCallId().get();
    // Send serverCallId to your recording server to start the call recording.
} catch (ExecutionException | InterruptedException e) {

} catch (UnsupportedOperationException unsupportedOperationException) {

}

При запуске записи с сервера событие handleCallOnIsRecordingChanged активируется и значение callRecordingFeature.isRecordingActive() равно true.

Как и при запуске записи звонка, если вы хотите остановить запись звонка, необходимо получить ServerCallId и отправить ее на сервер записи, чтобы он смог остановить запись:

try {
    String serverCallId = call.getInfo().getServerCallId().get();
    // Send serverCallId to your recording server to stop the call recording.
} catch (ExecutionException | InterruptedException e) {

} catch (UnsupportedOperationException unsupportedOperationException) {

}

При остановке записи с сервера событие handleCallOnIsRecordingChanged активируется и значение callRecordingFeature.isRecordingActive() равно false.

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

Создайте проект Xcode

В Xcode создайте новый проект iOS и выберите шаблон Single View App (Приложение с одним представлением). В этом кратком руководстве используется платформа SwiftUI, поэтому необходимо задать для языка значение SwiftUI и задать для интерфейса значение 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")
        }
})

Запись вызовов

Примечание.

Этот API предоставляется в качестве предварительной версии для разработчиков и может измениться на основе полученных отзывов. Не используйте этот API в рабочей среде. Чтобы использовать этот API, используйте бета-версию пакета SDK для Службы коммуникации Azure вызовов iOS.

Запись вызовов — это расширенная функция основного Call объекта.

Предупреждение

До версии 1.1.0 и бета-версии версии 1.1.0-beta.1 пакета SDK isRecordingActive для вызовов iOS Службы коммуникации Azure был частью Call объекта и didChangeRecordingState был частью делегатаCallDelegate. Для новых бета-версий эти API были перенесены как расширенная функция Call.

Сначала необходимо получить объект функции записи:

let callRecordingFeature = call.feature(Features.recording)

Затем вы можете убедиться, что вызов записывается, проверив свойство isRecordingActive объекта callRecordingFeature. Он возвращает Bool.

let isRecordingActive = callRecordingFeature.isRecordingActive;

Вы также можете подписаться на записи изменений, реализуя RecordingCallFeatureDelegate делегат в классе с событием didChangeRecordingState:

callRecordingFeature.delegate = self

// didChangeRecordingState is a member of RecordingCallFeatureDelegate
public func recordingCallFeature(_ recordingCallFeature: RecordingCallFeature, didChangeRecordingState args: PropertyChangedEventArgs) {
    let isRecordingActive = recordingFeature.isRecordingActive
}

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

После настройки записи звонков на сервере из приложения iOS необходимо получить ServerCallId значение из вызова, а затем отправить его на сервер, чтобы начать процесс записи. Значение можно найти ServerCallId с помощью getServerCallId() CallInfo класса. Класс можно найти в объекте CallInfo класса с помощью getInfo().

// Send serverCallId to your recording server to start the call recording.
let serverCallId = call.info.getServerCallId(){ (serverId, error) in }

При запуске записи с сервера событие didChangeRecordingState активируется и значение recordingFeature.isRecordingActive равно true.

Как и при запуске записи звонка, если вы хотите остановить запись звонка, необходимо получить ServerCallId и отправить ее на сервер записи, чтобы он смог остановить запись:

// Send serverCallId to your recording server to stop the call recording.
let serverCallId = call.info.getServerCallId(){ (serverId, error) in }

При остановке записи с сервера событие didChangeRecordingState активируется и значение recordingFeature.isRecordingActive равно false.

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

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

Для приложения UWP в Visual Studio 2022 создайте проект пустого приложения (универсального приложения 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 диспетчер пакетов> Manage NuGet Packages for Solution.
  2. Нажмите кнопку "Обзор", а затем введите Azure.Communication.Calling.WindowsClient в поле поиска.
  3. Убедитесь, что установлен флажок "Включить предварительную версию ".
  4. Azure.Communication.Calling.WindowsClient Выберите пакет и выберите Azure.Communication.Calling.WindowsClient версию 1.4.0-beta.1 или более новую версию.
  5. Установите флажок, соответствующий проекту Служб коммуникации на правой части вкладки.
  6. Нажмите кнопку Установить.

Запись вызовов

Запись вызовов — это расширенная функция основного Call объекта. Сначала необходимо получить объект функции записи:

RecordingCallFeature recordingFeature = call.Features.Recording;

Затем вы можете убедиться, что вызов записывается, проверив свойство IsRecordingActive объекта recordingFeature. Он возвращает boolean.

boolean isRecordingActive = recordingFeature.IsRecordingActive;

Вы также можете подписаться на запись изменений:

private async void Call__OnIsRecordingActiveChanged(object sender, PropertyChangedEventArgs args)
  boolean isRecordingActive = recordingFeature.IsRecordingActive;
}

recordingFeature.IsRecordingActiveChanged += Call__OnIsRecordingActiveChanged;

Запись соответствия требованиям

Запись соответствия требованиям записывается на основе политики Microsoft Teams. Его можно включить с помощью этого руководства. Общие сведения о записи на основе политик Teams для вызовов.

Запись на основе политик начинается автоматически, когда пользователь, имеющий политику, присоединяется к вызову. Чтобы получить уведомление из Службы коммуникации Azure о записи, используйте следующий код:

const callRecordingApi = call.feature(Features.Recording);

const isComplianceRecordingActive = callRecordingApi.isRecordingActive;

const isComplianceRecordingActiveChangedHandler = () => {
    console.log(callRecordingApi.isRecordingActive);
};

callRecordingApi.on('isRecordingActiveChanged', isComplianceRecordingActiveChangedHandler);

Вы также можете реализовать запись соответствия требованиям с помощью пользовательского бота записи. См. пример GitHub.

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