Gespreksopname op de client beheren

Belangrijk

De functionaliteit die in dit artikel wordt beschreven, is momenteel beschikbaar als openbare preview. Deze preview-versie wordt geleverd zonder een service level agreement en we raden deze niet aan voor productieworkloads. Misschien worden bepaalde functies niet ondersteund of zijn de mogelijkheden ervan beperkt. Zie Aanvullende gebruiksvoorwaarden voor Microsoft Azure-previews voor meer informatie.

Met het opnemen van gesprekken kunnen uw gebruikers gesprekken opnemen die ze maken met Azure Communication Services. In dit artikel leert u hoe u opname aan de clientzijde beheert. Voordat u begint, moet u de opname aan de serverzijde instellen.

Vereisten

Installeer de SDK

Gebruik de npm install opdracht om de Common and Calling SDK voor Azure Communication Services voor JavaScript te installeren:

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

Vereiste objecten initialiseren

Een CallClient exemplaar is vereist voor de meeste aanroepbewerkingen. Wanneer u een nieuw CallClient exemplaar maakt, kunt u deze configureren met aangepaste opties, zoals een Logger exemplaar.

Met het CallClient exemplaar kunt u een CallAgent exemplaar maken door het createCallAgentaan te roepen. Deze methode retourneert asynchroon een CallAgent exemplaarobject.

De createCallAgent methode gebruikt CommunicationTokenCredential als argument. Het accepteert een toegangstoken van een gebruiker.

U kunt de getDeviceManager methode op het CallClient exemplaar gebruiken om toegang te krijgen tot 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-connectiviteit met Microsoft-infrastructuur het beste beheren

Het Call Agent exemplaar helpt u bij het beheren van gesprekken (om aanroepen deel te nemen of te starten). Als u wilt werken met uw aanroepende SDK, moet u verbinding maken met de Microsoft-infrastructuur om meldingen van binnenkomende oproepen te ontvangen en andere gespreksgegevens te coördineren. Uw Call Agent heeft twee mogelijke statussen:

Verbinding maken ed: een Call Agent connectionStatue-waarde van Connected het middel dat de client-SDK is verbonden en meldingen van de Microsoft-infrastructuur kan ontvangen.

Verbinding verbroken - Een Call Agent connectionStatue-waarde van Disconnected statussen is er een probleem dat verhindert dat de SDK verbinding maakt. Call Agent moet opnieuw worden gemaakt.

  • invalidToken: Als een token is verlopen of een ongeldig exemplaar Call Agent wordt verbroken met deze fout.
  • connectionIssue: Als er een probleem is met de client die verbinding maakt met Microsoft infrascture, wordt de connectionIssue fout na veel nieuwe pogingen Call Agent weergegeven.

U kunt controleren of uw lokale Call Agent verbinding heeft met de Microsoft-infrastructuur door de huidige waarde van connectionState de eigenschap te controleren. Tijdens een actieve oproep kunt u naar de connectionStateChanged gebeurtenis luisteren om te bepalen of Call Agent wijzigingen van Verbinding maken naarstatus Verbroken zijn.

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

Notitie

Deze API wordt geleverd als preview voor ontwikkelaars en kan worden gewijzigd op basis van feedback die we ontvangen. Gebruik deze API niet in een productieomgeving. Als u deze API wilt gebruiken, gebruikt u de bètaversie van de Web-SDK voor aanroepen van Azure Communication Services.

Cloudopname

Gespreksopname is een uitgebreide functie van de kernaanroep-API. U moet eerst aanroepende functies importeren uit de Calling SDK:

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

Vervolgens kunt u het API-object van de opnamefuncties ophalen uit het aanroepexemplaren:

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

Als u wilt controleren of de oproep wordt geregistreerd, inspecteert u de isRecordingActive eigenschap van callRecordingApi. Het retourneert Boolean.

const isRecordingActive = callRecordingApi.isRecordingActive;

U kunt zich ook abonneren op opnamewijzigingen:

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

callRecordingApi.on('isRecordingActiveChanged', isRecordingActiveChangedHandler);

U kunt een lijst met opnamen ophalen met behulp van de recordings eigenschap van callRecordingApi. Het retourneert RecordingInfo[], die de huidige status van de cloudopname heeft.

const recordings = callRecordingApi.recordings;

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

U kunt zich ook abonneren en recordingsUpdated een verzameling bijgewerkte opnamen ophalen. Deze gebeurtenis wordt geactiveerd wanneer er een opname-update is.

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

Installeer de SDK

Zoek het build.gradle-bestand op projectniveau en voeg deze toe aan mavenCentral() de lijst met opslagplaatsen onder buildscript enallprojects:

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

Voeg vervolgens in het build.gradle-bestand op moduleniveau de volgende regels toe aan de dependencies sectie:

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

De vereiste objecten initialiseren

Als u een CallAgent exemplaar wilt maken, moet u de createCallAgent methode voor een CallClient exemplaar aanroepen. Hiermee wordt asynchroon een CallAgent exemplaarobject geretourneerd.

De createCallAgent methode wordt CommunicationUserCredential gebruikt als een argument, dat een toegangstoken inkapselt.

Als u toegang DeviceManagerwilt krijgen, moet u eerst een callAgent exemplaar maken. Vervolgens kunt u de CallClient.getDeviceManager methode gebruiken om op te halen 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();

Als u een weergavenaam voor de aanroeper wilt instellen, gebruikt u deze alternatieve methode:

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

Oproepen opnemen

Notitie

Deze API wordt geleverd als preview voor ontwikkelaars en kan worden gewijzigd op basis van feedback die we ontvangen. Gebruik deze API niet in een productieomgeving. Als u deze API wilt gebruiken, gebruikt u de bètaversie van de Azure Communication Services-aanroepende Android SDK.

Gespreksopname is een uitgebreide functie van het kernobject Call .

Waarschuwing

Tot versie 1.1.0 en bètaversie 1.1.0-beta.1 van de Azure Communication Services Calling Android SDK isRecordingActive en addOnIsRecordingActiveChangedListener deel uitmaakten van het Call object. Voor nieuwe bètaversies zijn deze API's verplaatst als een uitgebreide functie van Call.

U moet eerst het object voor de opnamefunctie verkrijgen:

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

Als u vervolgens wilt controleren of de oproep wordt vastgelegd, inspecteert u de isRecordingActive eigenschap van callRecordingFeature. Het retourneert boolean.

boolean isRecordingActive = callRecordingFeature.isRecordingActive();

U kunt zich ook abonneren op opnamewijzigingen:

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

callRecordingFeature.addOnIsRecordingActiveChangedListener(handleCallOnIsRecordingChanged);

Als u de opname vanuit uw toepassing wilt starten, volgt u eerst het overzicht van gespreksopnamen voor de stappen voor het instellen van gespreksopname.

Nadat u de oproepopname op uw server hebt ingesteld, moet u vanuit uw Android-toepassing de ServerCallId waarde van het gesprek verkrijgen en deze vervolgens naar uw server verzenden om het opnameproces te starten. U kunt de ServerCallId waarde vinden met behulp getServerCallId() van de CallInfo klasse. U vindt de CallInfo klasse in het klasseobject met behulp van 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) {

}

Wanneer u begint met opnemen vanaf de server, wordt de gebeurtenis handleCallOnIsRecordingChanged geactiveerd en de waarde is callRecordingFeature.isRecordingActive()true.

Net zoals bij het starten van de oproepopname, moet u de opname ophalen ServerCallId en verzenden naar de opnameserver, zodat de opname kan worden gestopt:

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

}

Wanneer u stopt met opnemen vanaf de server, wordt de gebeurtenis handleCallOnIsRecordingChanged geactiveerd en de waarde is callRecordingFeature.isRecordingActive()false.

Uw systeem instellen

Het Xcode-project maken

Maak in Xcode een nieuw iOS-project en selecteer de sjabloon Single View-app (Toepassing met één weergave). In deze quickstart wordt het SwiftUI-framework gebruikt, dus moet u Taal instellen op Swift en interface instellen op SwiftUI.

Tijdens deze quickstart gaat u geen tests maken. Schakel het selectievakje Inclusief tests uit.

Schermopname van het venster voor het maken van een project in Xcode.

Het pakket en afhankelijkheden installeren met CocoaPods

  1. Maak een Podfile voor uw toepassing, zoals in dit voorbeeld:

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

  3. Open .xcworkspace met behulp van Xcode.

Toegang tot de microfoon aanvragen

Voor toegang tot de microfoon van het apparaat moet u de lijst met gegevenseigenschappen van uw app bijwerken met behulp van NSMicrophoneUsageDescription. U stelt de gekoppelde waarde in op een tekenreeks die wordt opgenomen in het dialoogvenster dat het systeem gebruikt om toegang van de gebruiker aan te vragen.

Klik met de rechtermuisknop op de vermelding Info.plist van de projectstructuur en selecteer Open As>Source Code. Voeg de volgende regels toe in de sectie op het hoogste niveau <dict> en sla het bestand op.

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

Stel het app-framework in

Open het bestand ContentView.swift van uw project. Voeg een import declaratie toe aan het begin van het bestand om de AzureCommunicationCalling bibliotheek te importeren. Daarnaast importeert u AVFoundation. U hebt deze nodig voor audiomachtigingsaanvragen in de code.

import AzureCommunicationCalling
import AVFoundation

CallAgent initialiseren

Als u een CallAgent exemplaar CallClientwilt maken, moet u een callClient.createCallAgent methode gebruiken die asynchroon een CallAgent object retourneert nadat het is geïnitialiseerd.

Als u een aanroepclient wilt maken, geeft u een CommunicationTokenCredential object door:

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

Geef het CommunicationTokenCredential object door waarnaar u hebt gemaakt CallClienten stel de weergavenaam in:

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

Oproepen opnemen

Notitie

Deze API wordt geleverd als preview voor ontwikkelaars en kan worden gewijzigd op basis van feedback die we ontvangen. Gebruik deze API niet in een productieomgeving. Als u deze API wilt gebruiken, gebruikt u de bètaversie van de Azure Communication Services-sdk die iOS aanroept.

Gespreksopname is een uitgebreide functie van het kernobject Call .

Waarschuwing

Tot versie 1.1.0 en bètaversie 1.1.0-beta.1 van de Azure Communication Services-aanroepende iOS SDK, isRecordingActive maakte deel uit van het Call object en didChangeRecordingState maakte deel uit van de CallDelegate gemachtigde. Voor nieuwe bètaversies zijn deze API's verplaatst als een uitgebreide functie van Call.

U moet eerst het object voor de opnamefunctie verkrijgen:

let callRecordingFeature = call.feature(Features.recording)

Als u vervolgens wilt controleren of de oproep wordt vastgelegd, inspecteert u de isRecordingActive eigenschap van callRecordingFeature. Het retourneert Bool.

let isRecordingActive = callRecordingFeature.isRecordingActive;

U kunt zich ook abonneren op het vastleggen van wijzigingen door de RecordingCallFeatureDelegate gemachtigde in uw klas te implementeren met de gebeurtenis didChangeRecordingState:

callRecordingFeature.delegate = self

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

Als u de opname vanuit uw toepassing wilt starten, volgt u eerst het overzicht van gespreksopnamen voor de stappen voor het instellen van gespreksopname.

Nadat u de oproepopname op uw server hebt ingesteld, moet u vanuit uw iOS-toepassing de ServerCallId waarde van het gesprek verkrijgen en deze vervolgens naar uw server verzenden om het opnameproces te starten. U kunt de ServerCallId waarde vinden met behulp getServerCallId() van de CallInfo klasse. U vindt de CallInfo klasse in het klasseobject met behulp van getInfo().

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

Wanneer u begint met opnemen vanaf de server, wordt de gebeurtenis didChangeRecordingState geactiveerd en de waarde is recordingFeature.isRecordingActivetrue.

Net zoals bij het starten van de oproepopname, moet u de opname ophalen ServerCallId en verzenden naar de opnameserver, zodat de opname kan worden gestopt:

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

Wanneer u stopt met opnemen vanaf de server, wordt de gebeurtenis didChangeRecordingState geactiveerd en de waarde is recordingFeature.isRecordingActivefalse.

Uw systeem instellen

Het Visual Studio-project maken

Maak voor een UWP-app in Visual Studio 2022 een nieuw leeg app-project (Universal Windows). Nadat u de projectnaam hebt ingevoerd, kunt u een Windows SDK kiezen die hoger is dan 10.0.17763.0.

Maak voor een WinUI 3-app een nieuw project met de sjabloon Blank App, Packaged (WinUI 3 in Desktop) om een WinUI 3-app met één pagina in te stellen. Windows-app SDK versie 1.3 of hoger is vereist.

Installeer het pakket en afhankelijkheden met behulp van NuGet Pakketbeheer

De Aanroepende SDK-API's en -bibliotheken zijn openbaar beschikbaar via een NuGet-pakket.

De volgende stappen laten zien hoe u het NuGet-pakket Voor aanroepende SDK kunt vinden, downloaden en installeren:

  1. Open NuGet Pakketbeheer door Tools>NuGet Pakketbeheer> Manage NuGet Packages for Solution te selecteren.
  2. Selecteer Bladeren en voer Azure.Communication.Calling.WindowsClient het zoekvak in.
  3. Zorg ervoor dat het selectievakje Voorlopige versie opnemen is ingeschakeld.
  4. Selecteer het Azure.Communication.Calling.WindowsClient pakket en selecteer Azure.Communication.Calling.WindowsClientvervolgens 1.4.0-beta.1 of een nieuwere versie.
  5. Schakel het selectievakje in dat overeenkomt met het Communication Services-project op het tabblad aan de rechterkant.
  6. Selecteer de knop Installeren .

Oproepen opnemen

Gespreksopname is een uitgebreide functie van het kernobject Call . U moet eerst het object voor de opnamefunctie verkrijgen:

RecordingCallFeature recordingFeature = call.Features.Recording;

Als u vervolgens wilt controleren of de oproep wordt vastgelegd, inspecteert u de IsRecordingActive eigenschap van recordingFeature. Het retourneert boolean.

boolean isRecordingActive = recordingFeature.IsRecordingActive;

U kunt zich ook abonneren op opnamewijzigingen:

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

recordingFeature.IsRecordingActiveChanged += Call__OnIsRecordingActiveChanged;

Opname van naleving

Opname van naleving is een opname die is gebaseerd op het Microsoft Teams-beleid. U kunt dit inschakelen met behulp van deze zelfstudie: Inleiding tot op beleid gebaseerde opname van Teams voor oproepen.

Opname op basis van beleid wordt automatisch gestart wanneer een gebruiker die het beleid heeft, deelneemt aan een oproep. Gebruik de volgende code om een melding te ontvangen van Azure Communication Services over opname:

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

const isComplianceRecordingActive = callRecordingApi.isRecordingActive;

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

callRecordingApi.on('isRecordingActiveChanged', isComplianceRecordingActiveChangedHandler);

U kunt ook nalevingsopnamen implementeren met behulp van een aangepaste opnamebot. Zie het GitHub-voorbeeld.

Volgende stappen