Udostępnij za pośrednictwem


Zarządzanie rejestrowaniem wywołań na kliencie

Ważne

Funkcje opisane w tym artykule są obecnie dostępne w publicznej wersji zapoznawczej. Ta wersja zapoznawcza jest udostępniana bez umowy dotyczącej poziomu usług i nie zalecamy korzystania z niej w przypadku obciążeń produkcyjnych. Niektóre funkcje mogą być nieobsługiwane lub ograniczone. Aby uzyskać więcej informacji, zobacz Uzupełniające warunki korzystania z wersji zapoznawczych platformy Microsoft Azure.

Nagrywanie połączeń umożliwia użytkownikom rejestrowanie wywołań, które tworzą za pomocą usług Azure Communication Services. Z tego artykułu dowiesz się, jak zarządzać rejestrowaniem po stronie klienta. Przed rozpoczęciem należy skonfigurować nagrywanie po stronie serwera.

Wymagania wstępne

Instalacja zestawu SDK

Użyj polecenia , npm install aby zainstalować wspólny zestaw SDK usług Azure Communication Services i wywołujący dla języka JavaScript:

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

Inicjowanie wymaganych obiektów

Wystąpienie CallClient jest wymagane w przypadku większości operacji wywołania. Podczas tworzenia nowego CallClient wystąpienia można skonfigurować je za pomocą opcji niestandardowych, takich jak Logger wystąpienie.

CallClient Za pomocą wystąpienia można utworzyć CallAgent wystąpienie, wywołując element createCallAgent. Ta metoda asynchronicznie zwraca CallAgent obiekt wystąpienia.

Metoda createCallAgent używa CommunicationTokenCredential jako argumentu. Akceptuje token dostępu użytkownika.

Aby uzyskać dostęp deviceManagerdo obiektu , możesz użyć getDeviceManager metody w wystąpieniu CallClient .

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

Jak najlepiej zarządzać łącznością zestawu SDK z infrastrukturą firmy Microsoft

Wystąpienie Call Agent pomaga zarządzać wywołaniami (aby dołączyć lub uruchomić wywołania). Aby można było pracować z zestawem SDK wywołującym, należy połączyć się z infrastrukturą firmy Microsoft, aby otrzymywać powiadomienia o połączeniach przychodzących i koordynować inne szczegóły połączeń. Istnieją Call Agent dwa możliwe stany:

Połączenie edCall Agent wartość Connected connectionStatue oznacza, że zestaw SDK klienta jest połączony i może odbierać powiadomienia z infrastruktury firmy Microsoft.

RozłączoneCall Agent wartość Disconnected connectionStatue stanów występuje problem uniemożliwiający prawidłowe nawiązywanie połączenia z zestawem SDK. Call Agent należy utworzyć ponownie.

  • invalidToken: Jeśli token wygasł lub jest nieprawidłowe Call Agent wystąpienie rozłącza się z tym błędem.
  • connectionIssue: Jeśli występuje problem z połączeniem klienta z infrastrukturą firmy Microsoft, po wielu ponownych próbach Call AgentconnectionIssue wystąpi błąd.

Możesz sprawdzić, czy środowisko lokalne Call Agent jest połączone z infrastrukturą firmy Microsoft, sprawdzając bieżącą connectionState wartość właściwości. Podczas aktywnego wywołania można nasłuchiwać zdarzenia, connectionStateChanged aby określić, czy Call Agent zmiany z Połączenie dostanu Rozłączone.

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

Uwaga

Ten interfejs API jest udostępniany jako wersja zapoznawcza dla deweloperów i może ulec zmianie na podstawie otrzymywanych opinii. Nie używaj tego interfejsu API w środowisku produkcyjnym. Aby użyć tego interfejsu API, użyj wersji beta zestawu SDK wywołującego internetową usługę Azure Communication Services.

Nagrywanie w chmurze

Nagrywanie wywołań to rozszerzona funkcja podstawowego interfejsu API wywołań. Najpierw należy zaimportować funkcje wywołujące z zestawu Calling SDK:

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

Następnie możesz pobrać obiekt interfejsu API funkcji nagrywania z wystąpienia wywołania:

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

Aby sprawdzić, czy wywołanie jest rejestrowane, sprawdź isRecordingActive właściwość callRecordingApi. Zwraca wartość Boolean.

const isRecordingActive = callRecordingApi.isRecordingActive;

Możesz również subskrybować rejestrowanie zmian:

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

callRecordingApi.on('isRecordingActiveChanged', isRecordingActiveChangedHandler);

Listę nagrań można uzyskać przy użyciu recordings właściwości callRecordingApi. Zwraca wartość RecordingInfo[], która ma bieżący stan rejestrowania w chmurze.

const recordings = callRecordingApi.recordings;

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

Możesz również subskrybować i pobierać recordingsUpdated kolekcję zaktualizowanych nagrań. To zdarzenie jest wyzwalane za każdym razem, gdy istnieje aktualizacja nagrywania.

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

Instalacja zestawu SDK

Znajdź plik build.gradle na poziomie projektu i dodaj mavenCentral() go do listy repozytoriów w obszarze buildscript i allprojects:

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

Następnie w pliku build.gradle na poziomie modułu dependencies dodaj następujące wiersze do sekcji:

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

Inicjowanie wymaganych obiektów

Aby utworzyć CallAgent wystąpienie, należy wywołać createCallAgent metodę w wystąpieniu CallClient . To wywołanie asynchroniczne zwraca CallAgent obiekt wystąpienia.

Metoda createCallAgent przyjmuje CommunicationUserCredential jako argument, który hermetyzuje token dostępu.

Aby uzyskać dostęp, DeviceManagernależy najpierw utworzyć callAgent wystąpienie. Następnie możesz użyć metody , aby pobrać metodę CallClient.getDeviceManagerDeviceManager.

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

Aby ustawić nazwę wyświetlaną elementu wywołującego, użyj tej alternatywnej metody:

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

Nagrywanie rozmów

Uwaga

Ten interfejs API jest udostępniany jako wersja zapoznawcza dla deweloperów i może ulec zmianie na podstawie otrzymywanych opinii. Nie używaj tego interfejsu API w środowisku produkcyjnym. Aby użyć tego interfejsu API, użyj wersji beta zestawu SDK usługi Azure Communication Services wywołujących system Android.

Nagrywanie wywołań to rozszerzona funkcja obiektu podstawowego Call .

Ostrzeżenie

Do wersji 1.1.0 i wersji beta w wersji 1.1.0-beta.1 usługi Azure Communication Services wywołujących zestaw Android SDK isRecordingActive i addOnIsRecordingActiveChangedListener były częścią Call obiektu . W przypadku nowych wersji beta te interfejsy API zostały przeniesione jako rozszerzona funkcja .Call

Najpierw należy uzyskać obiekt funkcji nagrywania:

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

Następnie, aby sprawdzić, czy wywołanie jest rejestrowane, sprawdź isRecordingActive właściwość callRecordingFeature. Zwraca wartość boolean.

boolean isRecordingActive = callRecordingFeature.isRecordingActive();

Możesz również subskrybować rejestrowanie zmian:

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

callRecordingFeature.addOnIsRecordingActiveChangedListener(handleCallOnIsRecordingChanged);

Jeśli chcesz rozpocząć nagrywanie z aplikacji, najpierw wykonaj czynności opisane w temacie Omówienie nagrywania połączeń, aby zapoznać się z instrukcjami konfigurowania nagrywania połączeń.

Po skonfigurowaniu nagrywania wywołań na serwerze z poziomu aplikacji systemu Android należy uzyskać ServerCallId wartość z wywołania, a następnie wysłać go do serwera, aby rozpocząć proces nagrywania. Wartość można znaleźć ServerCallId przy użyciu getServerCallId() klasy CallInfo . Klasę CallInfo można znaleźć w obiekcie klasy przy użyciu polecenia 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) {

}

Po rozpoczęciu rejestrowania z serwera zdarzenie handleCallOnIsRecordingChanged jest wyzwalane, a wartość callRecordingFeature.isRecordingActive() to true.

Podobnie jak podczas uruchamiania nagrania połączenia, jeśli chcesz zatrzymać nagrywanie połączeń, musisz pobrać ServerCallId go i wysłać do serwera nagrywania, aby mógł zatrzymać nagrywanie:

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) {

}

Po zatrzymaniu rejestrowania z serwera zdarzenie handleCallOnIsRecordingChanged zostanie wyzwolone, a wartość callRecordingFeature.isRecordingActive() to false.

Konfigurowanie systemu

Tworzenie projektu Xcode

W programie Xcode utwórz nowy projekt systemu iOS i wybierz szablon Aplikacja z jednym widokiem. W tym przewodniku Szybki start jest używana struktura SwiftUI, dlatego należy ustawić wartość Language na Swift i ustawić wartość Interface (Interfejs ) na SwiftUI.

Podczas pracy z tym przewodnikiem Szybki start nie utworzysz testów. Możesz wyczyścić pole wyboru Uwzględnij testy .

Zrzut ekranu przedstawiający okno tworzenia projektu w programie Xcode.

Instalowanie pakietu i zależności przy użyciu narzędzia CocoaPods

  1. Utwórz plik Podfile dla aplikacji, podobnie jak w tym przykładzie:

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

  3. Otwórz .xcworkspace za pomocą programu Xcode.

Żądanie dostępu do mikrofonu

Aby uzyskać dostęp do mikrofonu urządzenia, należy zaktualizować listę właściwości informacji aplikacji przy użyciu polecenia NSMicrophoneUsageDescription. Skojarzona wartość zostanie ustawiona na ciąg, który zostanie uwzględniony w oknie dialogowym używanym przez system do żądania dostępu od użytkownika.

Kliknij prawym przyciskiem myszy wpis Info.plist drzewa projektu, a następnie wybierz pozycję Otwórz jako>kod źródłowy. Dodaj następujące wiersze w sekcji najwyższego poziomu <dict> , a następnie zapisz plik.

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

Konfigurowanie struktury aplikacji

Otwórz plik ContentView.swift projektu. Dodaj deklarację import na początku pliku, aby zaimportować bibliotekę AzureCommunicationCalling . Ponadto zaimportuj plik AVFoundation. Będą potrzebne żądania uprawnień dźwięku w kodzie.

import AzureCommunicationCalling
import AVFoundation

Inicjowanie klasy CallAgent

Aby utworzyć CallAgent wystąpienie z CallClientklasy , należy użyć callClient.createCallAgent metody, która asynchronicznie zwraca CallAgent obiekt po zainicjowaniu.

Aby utworzyć klienta wywołania, przekaż CommunicationTokenCredential obiekt:

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 Przekaż utworzony obiekt do CallClient, a następnie ustaw nazwę wyświetlaną:

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")
        }
})

Nagrywanie rozmów

Uwaga

Ten interfejs API jest udostępniany jako wersja zapoznawcza dla deweloperów i może ulec zmianie na podstawie otrzymywanych opinii. Nie używaj tego interfejsu API w środowisku produkcyjnym. Aby użyć tego interfejsu API, użyj wersji beta zestawu SDK usługi Azure Communication Services wywołującego zestaw SDK systemu iOS.

Nagrywanie wywołań to rozszerzona funkcja obiektu podstawowego Call .

Ostrzeżenie

Do wersji 1.1.0 i beta w wersji 1.1.0-beta.1 zestawu Azure Communication Services Calling iOS SDK isRecordingActive był częścią Call obiektu i didChangeRecordingState był częścią delegata CallDelegate . W przypadku nowych wersji beta te interfejsy API zostały przeniesione jako rozszerzona funkcja .Call

Najpierw należy uzyskać obiekt funkcji nagrywania:

let callRecordingFeature = call.feature(Features.recording)

Następnie, aby sprawdzić, czy wywołanie jest rejestrowane, sprawdź isRecordingActive właściwość callRecordingFeature. Zwraca wartość Bool.

let isRecordingActive = callRecordingFeature.isRecordingActive;

Możesz również subskrybować rejestrowanie zmian, implementując RecordingCallFeatureDelegate delegata w klasie za pomocą zdarzenia didChangeRecordingState:

callRecordingFeature.delegate = self

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

Jeśli chcesz rozpocząć nagrywanie z aplikacji, najpierw wykonaj czynności opisane w temacie Omówienie nagrywania połączeń, aby zapoznać się z instrukcjami konfigurowania nagrywania połączeń.

Po skonfigurowaniu nagrywania wywołań na serwerze z poziomu aplikacji systemu iOS należy uzyskać ServerCallId wartość z wywołania, a następnie wysłać je do serwera, aby rozpocząć proces nagrywania. Wartość można znaleźć ServerCallId przy użyciu getServerCallId() klasy CallInfo . Klasę CallInfo można znaleźć w obiekcie klasy przy użyciu polecenia getInfo().

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

Po rozpoczęciu rejestrowania z serwera zdarzenie didChangeRecordingState jest wyzwalane, a wartość recordingFeature.isRecordingActive to true.

Podobnie jak podczas uruchamiania nagrania połączenia, jeśli chcesz zatrzymać nagrywanie połączeń, musisz pobrać ServerCallId go i wysłać do serwera nagrywania, aby mógł zatrzymać nagrywanie:

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

Po zatrzymaniu rejestrowania z serwera zdarzenie didChangeRecordingState zostanie wyzwolone, a wartość recordingFeature.isRecordingActive to false.

Konfigurowanie systemu

Tworzenie projektu programu Visual Studio

W przypadku aplikacji platformy UWP w programie Visual Studio 2022 utwórz nowy projekt Pusta aplikacja (uniwersalny system Windows). Po wprowadzeniu nazwy projektu możesz wybrać dowolny zestaw Windows SDK nowszy niż 10.0.17763.0.

W przypadku aplikacji WinUI 3 utwórz nowy projekt z pustą aplikacją, spakowanym szablonem (WinUI 3 w programie Desktop), aby skonfigurować jednostronicową aplikację WinUI 3. Wymagany jest zestaw Windows App SDK w wersji 1.3 lub nowszej.

Instalowanie pakietu i zależności przy użyciu Menedżer pakietów NuGet

Interfejsy API i biblioteki zestawu SDK wywołujących są publicznie dostępne za pośrednictwem pakietu NuGet.

W poniższych krokach przedstawiono sposób znajdowania, pobierania i instalowania pakietu NuGet zestawu SDK wywołującego:

  1. Otwórz Menedżer pakietów NuGet, wybierając pozycję Narzędzia>NuGet Menedżer pakietów> Zarządzanie pakietami NuGet dla rozwiązania.
  2. Wybierz pozycję Przeglądaj, a następnie wprowadź Azure.Communication.Calling.WindowsClient ciąg w polu wyszukiwania.
  3. Upewnij się, że pole wyboru Uwzględnij wersję wstępną jest zaznaczone.
  4. Azure.Communication.Calling.WindowsClient Wybierz pakiet, a następnie wybierz Azure.Communication.Calling.WindowsClientwersję 1.4.0-beta.1 lub nowszą.
  5. Zaznacz pole wyboru odpowiadające projektowi Usług komunikacyjnych na karcie po prawej stronie.
  6. Wybierz przycisk Zainstaluj.

Nagrywanie rozmów

Nagrywanie wywołań to rozszerzona funkcja obiektu podstawowego Call . Najpierw należy uzyskać obiekt funkcji nagrywania:

RecordingCallFeature recordingFeature = call.Features.Recording;

Następnie, aby sprawdzić, czy wywołanie jest rejestrowane, sprawdź IsRecordingActive właściwość recordingFeature. Zwraca wartość boolean.

boolean isRecordingActive = recordingFeature.IsRecordingActive;

Możesz również subskrybować rejestrowanie zmian:

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

recordingFeature.IsRecordingActiveChanged += Call__OnIsRecordingActiveChanged;

Rejestrowanie zgodności

Rejestrowanie zgodności polega na rejestrowaniu na podstawie zasad usługi Microsoft Teams. Możesz ją włączyć, korzystając z tego samouczka: Wprowadzenie do rejestrowania opartego na zasadach usługi Teams na potrzeby wywołań.

Nagrywanie oparte na zasadach jest uruchamiane automatycznie, gdy użytkownik, który ma zasady dołącza do wywołania. Aby uzyskać powiadomienie z usług Azure Communication Services na temat rejestrowania, użyj następującego kodu:

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

const isComplianceRecordingActive = callRecordingApi.isRecordingActive;

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

callRecordingApi.on('isRecordingActiveChanged', isComplianceRecordingActiveChangedHandler);

Można również zaimplementować rejestrowanie zgodności przy użyciu niestandardowego bota rejestrowania. Zobacz przykład usługi GitHub.

Następne kroki