Управление записью звонков на клиенте
Важно!
Функции, описанные в этом документе, в настоящее время доступны в общедоступной предварительной версии. Эта предварительная версия предоставляется без соглашения об уровне обслуживания. Ее не следует использовать для производственных рабочих нагрузок. Некоторые функции могут не поддерживаться или их возможности могут быть ограничены. Дополнительные сведения см. в статье Дополнительные условия использования предварительных выпусков Microsoft Azure.
Запись звонков позволяет пользователям записывать свои звонки, выполненные с помощью Службы коммуникации 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.
В рамках этого краткого руководства вы не будете создавать модульные тесты или тесты пользовательского интерфейса. Вы можете очистить текстовые поля Включить модульные тесты и Включить тесты пользовательского интерфейса.
Установка пакета и его зависимостей с помощью CocoaPods
Создайте файл Podfile для своего приложения с таким содержимым:
platform :ios, '13.0' use_frameworks! target 'AzureCommunicationCallingSample' do pod 'AzureCommunicationCalling', '~> 1.0.0' end
Выполните
pod install
.Откройте
.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 входит isRecordingActive
Call
в состав объекта и 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
.