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

Важно!

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

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

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

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

С помощью команды npm install вы можете установить пакеты SDK JavaScript Служб коммуникации Azure для вызовов и типичных операций.

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

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

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

После создания экземпляра CallClient вы можете создать экземпляр CallAgent, вызвав метод createCallAgent для экземпляра CallClient. Этот метод асинхронно возвращает объект экземпляра 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 wherever desired. To console, file, buffer, REST API, etc...
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()

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

Примечание

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

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

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

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

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

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

const isRecordingActive = callRecordingApi.isRecordingActive;

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

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

callRecordingApi.on('isRecordingActiveChanged', isRecordingActiveChangedHandler);

Установка пакета 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, а затем получить DeviceManager с помощью метода CallClient.getDeviceManager.

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();

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

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

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

Примечание

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

Запись вызовов — это расширенная функция основного 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, который можно найти в объекте класса с помощью 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, поэтому для параметра Язык нужно задать значение Swift, а для параметра Пользовательский интерфейс — значение SwiftUI.

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

Screenshot that shows the window for creating a project within 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 в списке свойств сведений приложения. Задайте связанное значение для строки string, которая будет включена в диалоговое окно, отображаемое системой при запрашивании доступа у пользователя.

В дереве проекта щелкните правой кнопкой мыши запись Info.plist и выберите Open As>Source Code (Открыть как > Исходный код). Добавьте в раздел верхнего уровня <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")
        }
})

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

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

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

Примечание

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

Запись вызовов — это расширенная функция основного 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, который можно найти в объекте класса с помощью 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.

Дальнейшие действия