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
- Een Azure-account met een actief abonnement. Gratis een account maken
- Een geïmplementeerde Communication Services-resource. Een Communication Services-resource maken.
- Een gebruikerstoegangstoken om de aanroepende client in te schakelen. Zie Toegangstokens maken en beheren voor meer informatie.
- Optioneel: Voltooiing van de quickstart om spraakgesprekken toe te voegen aan uw toepassing.
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 createCallAgent
aan 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 exemplaarCall Agent
wordt verbroken met deze fout.connectionIssue
: Als er een probleem is met de client die verbinding maakt met Microsoft infrascture, wordt deconnectionIssue
fout na veel nieuwe pogingenCall 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 DeviceManager
wilt 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.
Het pakket en afhankelijkheden installeren met CocoaPods
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
Voer
pod install
uit.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 CallClient
wilt 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 CallClient
en 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.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:
// 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.isRecordingActive
false
.
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:
- Open NuGet Pakketbeheer door Tools>NuGet Pakketbeheer> Manage NuGet Packages for Solution te selecteren.
- Selecteer Bladeren en voer
Azure.Communication.Calling.WindowsClient
het zoekvak in. - Zorg ervoor dat het selectievakje Voorlopige versie opnemen is ingeschakeld.
- Selecteer het
Azure.Communication.Calling.WindowsClient
pakket en selecteerAzure.Communication.Calling.WindowsClient
vervolgens 1.4.0-beta.1 of een nieuwere versie. - Schakel het selectievakje in dat overeenkomt met het Communication Services-project op het tabblad aan de rechterkant.
- 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.