Delen via


Gesprekken beheren

Meer informatie over het beheren van aanroepen met de Azure Communication Services SDKS. We leren hoe u gesprekken plaatst, hun deelnemers en eigenschappen beheert.

Vereisten

Ondersteuning

In de volgende tabellen wordt ondersteuning voor brainstormruimten in Azure Communication Services gedefinieerd.

Identiteiten en oproeptypen

In de volgende tabel ziet u de ondersteuning van functies voor specifiek gesprekstype en specifieke identiteit.

Identiteiten Teams-vergadering Kamer 1:1 oproep Groepsgesprek 1:1 Teams-interopgesprek Groepsoproep voor Teams-interoperabiliteit
Communication Services-gebruiker ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Microsoft 365-gebruiker ✔️ ✔️ ✔️

Bedrijfsvoering

In de volgende tabel ziet u ondersteuning voor afzonderlijke API's in de aanroepende SDK die betrekking heeft op afzonderlijke identiteitstypen.

Bedrijfsvoering Communication Services-gebruiker Microsoft 365-gebruiker
Een aanroep starten naar de Communication Services-gebruiker ✔️
Een aanroep starten naar Microsoft 365-gebruiker ✔️ ✔️
Een oproep naar telefoonnummer starten ✔️ ✔️
Deelnemen aan een ruimte ✔️
Deelnemen aan een Teams-vergadering ✔️ ✔️
Deelnemen aan een gesprek op basis van groupId ✔️
Binnenkomende oproep accepteren of weigeren ✔️ ✔️
Oproep in de wacht zetten en hervatten ✔️ ✔️
Deelnemers ophalen ✔️ ✔️
Communication Services-gebruiker toevoegen ✔️
Communication Services-gebruiker verwijderen ✔️ ✔️
Microsoft 365-gebruiker toevoegen of verwijderen ✔️ ✔️
Telefoonnummer toevoegen of verwijderen ✔️ ✔️
Op afstand deelnemer dempen of dempen opheffen ✔️ [1] ✔️ [1]
Ophangen ✔️ ✔️
De oproep voor iedereen beëindigen ✔️ [2] ✔️

[1] De API wordt alleen ondersteund in groepsgesprekken, ruimten en Teams-vergaderingen. [2] De API wordt niet ondersteund in ruimten.

SDK's

In de volgende tabellen ziet u ondersteuning voor de functies in afzonderlijke Azure Communication Services SDK's.

Ondersteuningsstatus Het web Web-UI iOS iOS-gebruikersinterface Android Android-gebruikersinterface Windows
Wordt ondersteund ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

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 oproepen bij te wonen 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:

Verbonden - een Call Agent connectionStatue-waarde van Connected betekent dat de client SDK verbonden is en meldingen van de Microsoft-infrastructuur kan ontvangen.

Verbinding verbroken - Een verbindingsstatuswaarde van Disconnected geeft aan dat er een probleem is dat voorkomt dat de SDK goed verbinding kan maken. Call Agent moet opnieuw worden gemaakt.

  • invalidToken: Als een token is verlopen of ongeldig is, wordt de Call Agent-instantie met deze fout verbroken.
  • connectionIssue: als er een probleem is met de client die verbinding maakt met de Microsoft-infrastructuur, wordt na veel nieuwe pogingen Call Agent de fout connectionIssue 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 van de status Verbonden naar Verbroken is gewijzigd.

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

Een oproep doen

Als u een aanroep wilt maken en starten, gebruikt u een van de API's callAgent en geeft u een gebruiker op die u hebt gemaakt via de Communication Services Identity SDK.

Het maken en starten van oproepen is synchroon. Met de call instantie kunt u zich abonneren op oproepen gebeurtenissen.

Een 1:n-aanroep naar een gebruiker of PSTN plaatsen

Als u een andere gebruiker van Communication Services wilt bellen, gebruikt u de startCall methode op callAgent en geeft u de geadresseerde CommunicationUserIdentifier door die u hebt gemaakt met de Communication Services-beheerbibliotheek.

Gebruik de volgende code voor een aanroep van 1:1 voor een gebruiker:

const userCallee = { communicationUserId: '<ACS_USER_ID>' }
const oneToOneCall = callAgent.startCall([userCallee]);

Als u een oproep naar een openbaar telefoonnetwerk (PSTN) wilt plaatsen, gebruikt u de startCall methode op callAgent en geeft u de geadresseerde PhoneNumberIdentifier door. Uw Communication Services-resource moet zijn geconfigureerd om bellen via PSTN toe te staan.

Wanneer u een PSTN-nummer belt, geeft u uw alternatieve nummerweergave op. Een alternatieve nummerweergave is een telefoonnummer (gebaseerd op de E.164-standaard) waarmee de beller in een PSTN-oproep wordt geïdentificeerd. Dit is het telefoonnummer dat de ontvanger van de oproep ziet voor een inkomende oproep.

Notitie

Controleer de details van de aanbieding voor bellen via PSTN. Voor toegang tot het preview-programma, meld je aan voor het programma voor vroege gebruikers.

Gebruik de volgende code voor een oproep van 1:1 naar een PSTN-nummer:

const pstnCallee = { phoneNumber: '<ACS_USER_ID>' }
const alternateCallerId = {phoneNumber: '<ALTERNATE_CALLER_ID>'};
const oneToOneCall = callAgent.startCall([pstnCallee], { alternateCallerId });

Gebruik de volgende code voor een oproep van 1:n naar een gebruiker en een PSTN-nummer:

const userCallee = { communicationUserId: '<ACS_USER_ID>' }
const pstnCallee = { phoneNumber: '<PHONE_NUMBER>'};
const alternateCallerId = {phoneNumber: '<ALTERNATE_CALLER_ID>'};
const groupCall = callAgent.startCall([userCallee, pstnCallee], { alternateCallerId });

Deelnemen aan een chatgesprek

Als u wilt deelnemen aan een room gesprek, kunt u een contextobject instantiëren met de roomId eigenschap als id room . Om deel te nemen aan de aanroep, gebruikt u de join-methode en geeft u de contextinstantie door.

const context = { roomId: '<RoomId>' }
const call = callAgent.join(context);

Een room biedt toepassingsontwikkelaars betere controle over wie kan deelnemen aan een gesprek, wanneer ze vergaderen en hoe ze samenwerken. Voor meer informatie rooms, kunt u de conceptuele documentatie lezen of de snelstartgids volgen.

Deelnemen aan een groepsgesprek

Notitie

De groupId parameter wordt beschouwd als systeemmetagegevens en kan door Microsoft worden gebruikt voor bewerkingen die nodig zijn om het systeem uit te voeren. Neem geen persoonlijke gegevens op in de groupId waarde. Microsoft behandelt deze parameter niet als persoonlijke gegevens en de inhoud ervan is mogelijk zichtbaar voor werknemers van Microsoft of opgeslagen op lange termijn.

De groupId parameter vereist dat gegevens de GUID-indeling hebben. U wordt aangeraden willekeurig gegenereerde GUID's te gebruiken die niet als persoonlijke gegevens in uw systemen worden beschouwd.

Als u een nieuwe groepsaanroep wilt starten of lid wilt worden van een doorlopende groepsoproep, gebruikt u de join methode en geeft u een object door met een groupId eigenschap. De groupId waarde moet een GUID zijn.

const context = { groupId: '<GUID>'};
const call = callAgent.join(context);

Een binnenkomende oproep ontvangen

Het callAgent exemplaar verzendt een incomingCall gebeurtenis wanneer de aangemelde identiteit een inkomende oproep ontvangt. Als u naar deze gebeurtenis wilt luisteren, abonneert u zich met een van de volgende opties:

const incomingCallHandler = async (args: { incomingCall: IncomingCall }) => {
    const incomingCall = args.incomingCall;

    // Get incoming call ID
    var incomingCallId = incomingCall.id

    // Get information about this Call. This API is provided as a preview for developers
    // and may change based on feedback that we receive. Do not use this API in a production environment.
    // To use this api please use 'beta' release of Azure Communication Services Calling Web SDK
    var callInfo = incomingCall.info;

    // Get information about caller
    var callerInfo = incomingCall.callerInfo

    // Accept the call
    var call = await incomingCall.accept();

    // Reject the call
    incomingCall.reject();

    // Subscribe to callEnded event and get the call end reason
     incomingCall.on('callEnded', args => {
        console.log(args.callEndReason);
    });

    // callEndReason is also a property of IncomingCall
    var callEndReason = incomingCall.callEndReason;
};
callAgentInstance.on('incomingCall', incomingCallHandler);

De incomingCall gebeurtenis omvat een incomingCall exemplaar dat u kunt accepteren of afwijzen.

De Azure Communication Calling SDK genereert een "cameraStartFailed: true"-diagnose wanneer de camera niet beschikbaar is bij het starten, accepteren of deelnemen aan een gesprek met ingeschakelde video. In dit geval begint het gesprek zonder video. De camera is mogelijk niet beschikbaar omdat deze wordt gebruikt door een ander proces of omdat deze is uitgeschakeld in het besturingssysteem.

Oproep in de wacht zetten en hervatten

Notitie

Op elk willekeurig moment mag er slechts 1 actieve oproep zijn (in de Connected-toestand, met actieve media). Alle andere aanroepen moeten in de wacht worden gezet door een gebruiker of programmatisch door de applicatie. Dit is gebruikelijk in scenario's zoals contactcentra, waarbij een gebruiker mogelijk meerdere uitgaande en inkomende oproepen moet verwerken, alle inactieve oproepen in de wacht moeten worden gezet en de gebruiker alleen in actieve oproep met anderen moet communiceren

Als u de aanroep wilt bewaren of hervatten, kunt u de hold en resume asynchrone API's gebruiken:

De oproep in de wacht zetten

await call.hold();

Wanneer de hold API is opgelost, wordt de aanroepstatus ingesteld op LocalHold. In een gesprek van 1:1 wordt de andere deelnemer ook in de wacht gezet en wordt de status van de oproep vanuit het perspectief van die deelnemer ingesteld op RemoteHold. Later kan de andere deelnemer zijn oproep in de wacht zetten, wat tot een statuswijziging naar LocalHold zou leiden. In een groepsgesprek of -vergadering is de hold een lokale bewerking, die de oproep voor andere deelnemers niet beïnvloedt. Om de oproep te hervatten, moeten alle gebruikers die de oproep in de wacht hebben gezet deze hervatten.

Volg deze stappen om de oproep vanuit wachtstand te hervatten:

await call.resume();

Wanneer de resume API is afgerond, wordt de oproepstatus opnieuw ingesteld op Connected.

Een oproep dempen en het dempen opheffen

Als u het lokale eindpunt wilt dempen of de demping wilt opheffen, kunt u de mute en unmute asynchrone API's gebruiken.

//mute local device (microphone / sent audio)
await call.mute();

//unmute local device (microphone / sent audio)
await call.unmute();

Binnenkomende audio dempen en het dempen opheffen

Als u binnenkomende audio dempt, wordt het oproepvolume ingesteld op 0. Als u de binnenkomende audio wilt dempen of dempen wilt opheffen, kunt u de asynchrone API's muteIncomingAudio en unmuteIncomingAudio gebruiken.

//mute local device (speaker)
await call.muteIncomingAudio();

//unmute local device (speaker)
await call.unmuteIncomingAudio();

Wanneer binnenkomende audio is gedempt, ontvangt de client-SDK van de deelnemer nog steeds de oproepaudio (audio van externe deelnemers). De oproepaudio wordt niet gehoord in de spreker en de deelnemer kan pas luisteren als 'call.unmuteIncomingAudio()' wordt aangeroepen. We kunnen echter filter toepassen op gespreksaudio en de gefilterde audio afspelen.

Externe deelnemers beheren

Alle externe deelnemers worden in het RemoteParticipant object beschreven en zijn beschikbaar via de remoteParticipants collectie op een oproepinstantie. De remoteParticipants is toegankelijk vanuit een Call instantie.

Deelnemers van een gesprek opsommen

De remoteParticipants verzameling retourneert een lijst met externe deelnemers in een gesprek:

call.remoteParticipants; // [remoteParticipant, remoteParticipant....]

Een deelnemer toevoegen aan een gesprek

Als u een deelnemer (een gebruiker of een telefoonnummer) wilt toevoegen aan een aanroep, kunt u de addParticipant API gebruiken. Geef een van de Identifier typen op. De remoteParticipant-instantie wordt synchroon geretourneerd. De remoteParticipantsUpdated gebeurtenis van Call wordt gegenereerd wanneer een deelnemer met succes is toegevoegd aan het gesprek.

const userIdentifier = { communicationUserId: '<ACS_USER_ID>' };
const pstnIdentifier = { phoneNumber: '<PHONE_NUMBER>' }
const remoteParticipant = call.addParticipant(userIdentifier);
const alternateCallerId = {  phoneNumber: '<ALTERNATE_CALLER_ID>' };
const remoteParticipant = call.addParticipant(pstnIdentifier, { alternateCallerId });

Een deelnemer uit een gesprek verwijderen

Als u een deelnemer (een gebruiker of een telefoonnummer) uit een gesprek wilt verwijderen, kunt u aanroepen removeParticipant. U moet een van de Identifier typen doorgeven. Deze methode lost asynchroon op nadat de deelnemer uit de oproep is verwijderd. De deelnemer wordt ook uit de remoteParticipants verzameling verwijderd.

const userIdentifier = { communicationUserId: '<ACS_USER_ID>' };
const pstnIdentifier = { phoneNumber: '<PHONE_NUMBER>' }
await call.removeParticipant(userIdentifier);
await call.removeParticipant(pstnIdentifier);

Toegang tot eigenschappen van externe deelnemers

Externe deelnemers hebben een set gekoppelde eigenschappen en verzamelingen:

  • CommunicationIdentifier: Haal de identificatie op voor een externe deelnemer. Identiteit is een van de CommunicationIdentifier volgende typen:
const identifier = remoteParticipant.identifier;
  • Dit kan een van de volgende CommunicationIdentifier typen zijn:

    • { communicationUserId: '<ACS_USER_ID'> }: Object dat de Azure Communication Services-gebruiker vertegenwoordigt.
    • { phoneNumber: '<E.164>' }: Object dat het telefoonnummer in E.164-indeling vertegenwoordigt.
    • { microsoftTeamsUserId: '<TEAMS_USER_ID>', isAnonymous?: boolean; cloud?: "public" | "dod" | "gcch" }: Object dat de Teams-gebruiker vertegenwoordigt.
    • { id: string }: object dat de id vertegenwoordigt die niet past bij een van de andere id-typen
  • state: Haal de status van een externe deelnemer op.

const state = remoteParticipant.state;
  • De status kan het volgende zijn:

    • Idle: Initiële status.
    • Connecting: Overgangsstatus terwijl een deelnemer verbinding maakt met het gesprek.
    • Ringing: Deelnemer wordt gebeld.
    • Connected: Deelnemer is verbonden met het gesprek.
    • Hold: Deelnemer staat in de wacht.
    • EarlyMedia: Aankondiging die wordt afgespeeld voordat een deelnemer verbinding maakt met het gesprek.
    • InLobby: Geeft aan dat externe deelnemer zich in de lobby bevindt.
    • Disconnected: Laatste status. De deelnemer wordt losgekoppeld van het gesprek. Als de externe deelnemer de netwerkverbinding verliest, verandert hun status na twee minuten naar Disconnected.
  • callEndReason: Als u wilt weten waarom een deelnemer de oproep heeft verlaten, controleert u de callEndReason eigenschap:

    const callEndReason = remoteParticipant.callEndReason;
    const callEndReasonCode = callEndReason.code // (number) code associated with the reason
    const callEndReasonSubCode = callEndReason.subCode // (number) subCode associated with the reason
    

    Opmerking:

    • Deze eigenschap wordt alleen ingesteld wanneer u een externe deelnemer toevoegt via de Call.addParticipant() API en de externe deelnemer bijvoorbeeld weigert.
    • In het scenario, waarbij UserB UserC kickt vanuit het perspectief van UserA, ziet UserA deze vlag niet ingesteld voor UserC. Met andere woorden, UserA ziet dat de eigenschap CallEndReason van UserC helemaal niet wordt ingesteld.
  • isMuted status: Als u wilt controleren of een externe deelnemer is gedempt, controleert u de isMuted-eigenschap. Het retourneert Boolean.

    const isMuted = remoteParticipant.isMuted;
    
  • isSpeaking status: Als u wilt achterhalen of een externe deelnemer spreekt, controleert u de isSpeaking eigenschap. Het retourneert Boolean.

    const isSpeaking = remoteParticipant.isSpeaking;
    
  • videoStreams: Als u alle videostreams wilt inspecteren die een bepaalde deelnemer in deze oproep verzendt, controleert u de videoStreams verzameling. Het bevat RemoteVideoStream objecten.

    const videoStreams = remoteParticipant.videoStreams; // [RemoteVideoStream, ...]
    
  • displayName: Om de weergavenaam voor deze externe deelnemer op te halen, inspecteer de displayName-eigenschap; deze retourneert een tekenreeks.

    const displayName = remoteParticipant.displayName;
    
  • endpointDetails: De details van alle eindpunten voor deze externe deelnemer ophalen

        const endpointDetails: EndpointDetails[] = remoteParticipant.endpointDetails;
    

    Opmerking: een externe deelnemer kan aan het gesprek deelnemen vanaf veel eindpunten, en elk eindpunt heeft een eigen unieke participantId. participantId verschilt van de onbewerkte ID van RemoteParticipant.identifier.

Andere deelnemers dempen

Notitie

Als u deze API wilt gebruiken, gebruikt u Azure Communication Services- en web-SDK-versie 1.26.1 of hoger.

Als u alle andere deelnemers wilt dempen of een specifieke deelnemer wilt dempen die is verbonden met een gesprek, kunt u de asynchrone API's muteAllRemoteParticipants voor het gesprek en mute de externe deelnemer gebruiken. De mutedByOthers gebeurtenis van de oproep wordt opgeroepen wanneer de lokale deelnemer door anderen is gedempt.

Opmerking: de scenario's voor het dempen van PSTN-deelnemers (telefoonnummer) of 1:1 gespreksdeelnemers worden niet ondersteund.

//mute all participants except yourself
await call.muteAllRemoteParticipants();

//mute a specific participant
await call.remoteParticipants[0].mute();

Gesprekseigenschappen controleren

Haal de unieke ID (tekenreeks) voor een oproep op:

const callId: string = call.id;

Haal de lokale deelnemer-id op:

const participantId: string = call.info.participantId;

Opmerking: een Azure Communication Services-identiteit kan de SDK voor webaanroepen in veel eindpunten gebruiken en elk eindpunt heeft een eigen unieke participantId. participantId verschilt van de onbewerkte ID van de Azure Communication Services-identiteit.

Haal de thread-id op als u deelneemt aan een Teams-vergadering:

const threadId: string | undefined = call.info.threadId;

Informatie over de oproep:

const callInfo = call.info;

Kom meer te weten over andere deelnemers aan de oproep door de remoteParticipants-verzameling op de 'oproepinstantie' te inspecteren.

const remoteParticipants = call.remoteParticipants;

Identificeer de beller van een inkomende oproep:

const callerIdentity = call.callerInfo.identifier;

identifier is een van de CommunicationIdentifier typen.

De status van een oproep ophalen:

const callState = call.state;

Hiermee wordt een tekenreeks geretourneerd die de huidige status van een aanroep aangeeft:

  • None: Eerste aanroepstatus.
  • Connecting: Initiële overgangsstatus wanneer een oproep wordt geplaatst of geaccepteerd.
  • Ringing: Voor een uitgaande oproep geeft u aan dat een oproep wordt gebeld voor externe deelnemers. Het is Incoming aan hun zijde.
  • EarlyMedia: Geeft een status aan waarin een aankondiging wordt afgespeeld voordat de oproep is verbonden.
  • Connected: Geeft aan dat de oproep is verbonden.
  • LocalHold: Geeft aan dat een lokale deelnemer het gesprek in de wachtstand heeft gezet. Er stromen geen media tussen het lokale eindpunt en externe deelnemers.
  • RemoteHold: Geeft aan dat een externe deelnemer het gesprek in de wachtstand zet. Er stromen geen media tussen het lokale eindpunt en externe deelnemers.
  • InLobby: Geeft aan dat de gebruiker zich in de lobby bevindt.
  • Disconnecting: Overgangsstatus voordat de aanroep naar een Disconnected status gaat.
  • Disconnected: Status van laatste aanroep. Als de netwerkverbinding is verbroken, wordt de status na twee minuten gewijzigd Disconnected .

Ontdek waarom een aanroep is beëindigd door de callEndReason eigenschap te inspecteren:

const callEndReason = call.callEndReason;
const callEndReasonMessage = callEndReason.message // (string) user friendly message
const callEndReasonCode = callEndReason.code // (number) code associated with the reason
const callEndReasonSubCode = callEndReason.subCode // (number) subCode associated with the reason

Lees of de huidige oproep binnenkomend of uitgaand is door de direction eigenschap te inspecteren. Het retourneert CallDirection.

const isIncoming = call.direction == 'Incoming';
const isOutgoing = call.direction == 'Outgoing';

Inspecteer de actieve videostreams en actieve schermdeelstreams door de localVideoStreams verzameling te controleren. De localVideoStreams API retourneert LocalVideoStream objecten van het type Video, ScreenSharingof RawMedia.

const localVideoStreams = call.localVideoStreams;

Controleer of de huidige microfoon is gedempt. Het geeft Boolean terug.

const muted = call.isMuted;

Controleer of de huidige binnenkomende audio (luidspreker) is gedempt. Het retourneert Boolean.

const incomingAudioMuted = call.isIncomingAudioMuted;

Controleer of de video is ingeschakeld. Het retourneert Boolean.

const isLocalVideoStarted = call.isLocalVideoStarted;

Controleer of het delen van het scherm is ingeschakeld. Het retourneert Boolean.

const isScreenSharingOn = call.isScreenSharingOn;

Ophangen

Er zijn twee manieren waarop u het gesprek kunt ophangen. U kunt het gesprek verlaten en andere deelnemers in het gesprek houden of de oproep voor alle deelnemers beëindigen. Als u het gesprek wilt verlaten, gebruikt u gewoon

call.hangUp();

U kunt de oproep voor alle deelnemers ook beëindigen als u dit opgeeft HangUpOptions.

Notitie

Deze API is niet beschikbaar in ruimten.

call.hangUp( forEveryone: true);

Installeer de SDK

Zoek je projectniveau build.gradle bestand en voeg mavenCentral() toe aan de lijst met opslagplaatsen onder buildscript en allprojects:

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

Voeg vervolgens in het bestand op moduleniveau build.gradle 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 neemt CommunicationUserCredential als argument, dat een toegangstoken omvat.

Om toegang tot DeviceManager te krijgen, moet u eerst een callAgent instantie 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();

Een oproep doen

Als u een aanroep wilt maken en starten, moet u de CallAgent.startCall() methode aanroepen en de Identifier nummer(en) opgeven. Als u wilt deelnemen aan een groepsoproep, moet u de CallAgent.join() methode aanroepen en de groupId opgeven. Groeps-id's moeten de GUID- of UUID-indeling hebben.

Het maken en starten van oproepen is synchroon. Met het call-exemplaar kunt u zich abonneren op alle gebeurtenissen van de oproep.

Een 1:1-aanroep naar een gebruiker plaatsen

Als u een aanroep naar een andere Communication Services-gebruiker wilt plaatsen, roept u de call methode aan callAgent en geeft u een object met communicationUserId sleutel door.

StartCallOptions startCallOptions = new StartCallOptions();
Context appContext = this.getApplicationContext();
CommunicationUserIdentifier acsUserId = new CommunicationUserIdentifier(<USER_ID>);
CommunicationUserIdentifier participants[] = new CommunicationUserIdentifier[]{ acsUserId };
call oneToOneCall = callAgent.startCall(appContext, participants, startCallOptions);

Een 1:n-oproep plaatsen met gebruikers en PSTN

Notitie

Controleer de details van de aanbieding voor bellen via PSTN. Voor toegang tot het preview-programma, meld je aan voor het early adopter-programma.

Als u een 1-op-n-gesprek naar een gebruiker en een PSTN-nummer wilt plaatsen, moet u het telefoonnummer van de gebelde opgeven. Uw Communication Services-resource moet zijn geconfigureerd om bellen via PSTN toe te staan:

CommunicationUserIdentifier acsUser1 = new CommunicationUserIdentifier(<USER_ID>);
PhoneNumberIdentifier acsUser2 = new PhoneNumberIdentifier("<PHONE_NUMBER>");
CommunicationIdentifier participants[] = new CommunicationIdentifier[]{ acsUser1, acsUser2 };
StartCallOptions startCallOptions = new StartCallOptions();
Context appContext = this.getApplicationContext();
Call groupCall = callAgent.startCall(participants, startCallOptions);

Een gesprek accepteren

Als u een aanroep wilt accepteren, roept u de methode 'accepteren' aan voor een aanroepobject.

Context appContext = this.getApplicationContext();
IncomingCall incomingCall = retrieveIncomingCall();
Call call = incomingCall.accept(context).get();

Een gesprek met videocamera accepteren op:

Context appContext = this.getApplicationContext();
IncomingCall incomingCall = retrieveIncomingCall();
AcceptCallOptions acceptCallOptions = new AcceptCallOptions();
VideoDeviceInfo desiredCamera = callClient.getDeviceManager().get().getCameraList().get(0);
acceptCallOptions.setVideoOptions(new VideoOptions(new LocalVideoStream(desiredCamera, appContext)));
Call call = incomingCall.accept(context, acceptCallOptions).get();

De binnenkomende oproep kan worden verkregen door u te abonneren op de onIncomingCall gebeurtenis op het callAgent object:

// Assuming "callAgent" is an instance property obtained by calling the 'createCallAgent' method on CallClient instance 
public Call retrieveIncomingCall() {
    IncomingCall incomingCall;
    callAgent.addOnIncomingCallListener(new IncomingCallListener() {
        void onIncomingCall(IncomingCall inboundCall) {
            // Look for incoming call
            incomingCall = inboundCall;
        }
    });
    return incomingCall;
}

Deelnemen aan een chatgesprek

Gebruik de CallAgent en RoomCallLocator om deel te nemen aan een chatgesprek door een roomId. De CallAgent.join methode retourneert een Call object:

val roomCallLocator = RoomCallLocator(roomId)
call = callAgent.join(applicationContext, roomCallLocator, joinCallOptions)

Een room biedt toepassingsontwikkelaars betere controle over wie kan deelnemen aan een gesprek, wanneer ze vergaderen en hoe ze samenwerken. Voor meer informatie rooms, kunt u de conceptuele documentatie lezen of de snelstartgids volgen.

Deelnemen aan een groepsgesprek

Als u een nieuwe groepsoproep wilt starten of wilt deelnemen aan een doorlopende groepsoproep, moet u de methode 'join' aanroepen en een object doorgeven met een groupId eigenschap. De waarde moet een GUID zijn.

Context appContext = this.getApplicationContext();
GroupCallLocator groupCallLocator = new GroupCallLocator("<GUID>");
JoinCallOptions joinCallOptions = new JoinCallOptions();

call = callAgent.join(context, groupCallLocator, joinCallOptions);

Eigenschappen van aanroepen

Haal de unieke ID voor deze oproep op.

String callId = call.getId();

Om meer te leren over andere deelnemers in de oproep, inspecteer de remoteParticipant verzameling op het call exemplaar.

List<RemoteParticipant> remoteParticipants = call.getRemoteParticipants();

De identiteit van de beller als de oproep binnenkomt:

CommunicationIdentifier callerId = call.getCallerInfo().getIdentifier();

Haal de status van de oproep op:

CallState callState = call.getState();

Hiermee wordt een tekenreeks geretourneerd die de huidige status van een aanroep aangeeft:

  • 'NONE' - beginoproepstatus
  • 'EARLY_MEDIA': geeft een status aan waarin een aankondiging wordt afgespeeld voordat de oproep is verbonden
  • 'VERBINDING MAKEN' - initiële overgangsstatus zodra de aanroep is geplaatst of geaccepteerd
  • 'BELLEN' - voor een uitgaande oproep - geeft aan dat de oproep wordt gebeld voor externe deelnemers
  • 'VERBONDEN' - de oproep is verbonden
  • 'LOCAL_HOLD': oproep wordt in de wacht gezet door lokale deelnemer, er wordt geen media verzonden tussen het lokale eindpunt en de externe deelnemer(s)
  • 'REMOTE_HOLD': oproep wordt in de wacht gehouden door een externe deelnemer, er wordt geen media verzonden tussen het lokale eindpunt en de externe deelnemer(s)
  • 'VERBINDING VERBREKEN': overgangsstatus voordat de aanroep de status Verbroken wordt
  • 'VERBINDING VERBROKEN' - eindstatus van de oproep
  • 'IN_LOBBY': in de lobby voor interoperabiliteit bij Teams-vergaderingen

Als u wilt weten waarom een oproep is beëindigd, inspecteert u de eigenschap callEndReason. Het bevat code/subcode:

CallEndReason callEndReason = call.getCallEndReason();
int code = callEndReason.getCode();
int subCode = callEndReason.getSubCode();

Als u wilt zien of de huidige oproep een binnenkomende of uitgaande oproep is, inspecteert u callDirection de eigenschap:

CallDirection callDirection = call.getCallDirection(); 
// callDirection == CallDirection.INCOMING for incoming call
// callDirection == CallDirection.OUTGOING for outgoing call

Als u wilt zien of de huidige microfoon is gedempt, controleert u de muted eigenschap:

boolean muted = call.isMuted();

Als u actieve videostreams wilt controleren, controleert u de localVideoStreams verzameling:

List<LocalVideoStream> localVideoStreams = call.getLocalVideoStreams();

Dempen en geluid aanzetten

Als u het lokale eindpunt wilt dempen of de demping wilt opheffen, kunt u de mute en unmute asynchrone API's gebruiken.

Context appContext = this.getApplicationContext();
call.mute(appContext).get();
call.unmute(appContext).get();

Het volume van de aanroep wijzigen

Terwijl u in gesprek bent, moet de gebruiker met de hardwarevolumetoetsen op de telefoon het oproepvolume kunnen wijzigen. Dit wordt gedaan met behulp van de methode setVolumeControlStream met het stroomtype AudioManager.STREAM_VOICE_CALL op de activiteit waar de aanroep wordt geplaatst. Hierdoor kunnen de hardwarevolumetoetsen het volume van het gesprek wijzigen (aangeduid door een telefoonpictogram of iets dergelijks op de volumeschuifregelaar), waardoor het volume voor andere geluidsprofielen, zoals alarmen, media of systeembrede volume, niet kan worden gewijzigd. Voor meer informatie kunt u de verwerking van wijzigingen in audio-uitvoer controleren | Android-ontwikkelaars.

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
}

Beheer van externe deelnemers

Alle externe deelnemers worden vertegenwoordigd door RemoteParticipant type en zijn beschikbaar via de remoteParticipants verzameling op een oproepvoorbeeld.

Deelnemers opsommen in een oproep

De remoteParticipants verzameling retourneert een lijst met externe deelnemers in een bepaalde oproep:

List<RemoteParticipant> remoteParticipants = call.getRemoteParticipants(); // [remoteParticipant, remoteParticipant....]

Een deelnemer toevoegen aan een gesprek

Als u een deelnemer wilt toevoegen aan een gesprek (een gebruiker of een telefoonnummer), kunt u aanroepen addParticipant. Hiermee wordt het exemplaar van de externe deelnemer synchroon geretourneerd.

const acsUser = new CommunicationUserIdentifier("<acs user id>");
const acsPhone = new PhoneNumberIdentifier("<phone number>");
RemoteParticipant remoteParticipant1 = call.addParticipant(acsUser);
AddPhoneNumberOptions addPhoneNumberOptions = new AddPhoneNumberOptions(new PhoneNumberIdentifier("<alternate phone number>"));
RemoteParticipant remoteParticipant2 = call.addParticipant(acsPhone, addPhoneNumberOptions);

Deelnemer uit een gesprek verwijderen

Als u een deelnemer wilt verwijderen uit een gesprek (een gebruiker of een telefoonnummer), kunt u aanroepen removeParticipant. Dit wordt asynchroon opgelost zodra de deelnemer uit het gesprek is verwijderd. De deelnemer wordt ook uit remoteParticipants de verzameling verwijderd.

RemoteParticipant acsUserRemoteParticipant = call.getParticipants().get(0);
RemoteParticipant acsPhoneRemoteParticipant = call.getParticipants().get(1);
call.removeParticipant(acsUserRemoteParticipant).get();
call.removeParticipant(acsPhoneRemoteParticipant).get();

Eigenschappen van externe deelnemers

Aan elke externe deelnemer zijn een set eigenschappen en verzamelingen gekoppeld:

  • Haal de identificatie voor deze externe deelnemer op. Identiteit is een van de 'Identifier'-typen

    CommunicationIdentifier participantIdentifier = remoteParticipant.getIdentifier();
    
  • Status van deze externe deelnemer ophalen.

    ParticipantState state = remoteParticipant.getState();
    

Status kan een van

  • 'INACTIVITEIT' - initiële status

  • 'EARLY_MEDIA' - aankondiging wordt afgespeeld voordat de deelnemer is verbonden met het gesprek

  • 'BELLEN' - oproep van deelnemers gaat over

  • 'VERBINDING MAKEN' - overgangsstatus terwijl de deelnemer verbinding maakt met het gesprek

  • 'VERBONDEN' - deelnemer is verbonden met het gesprek

  • 'HOLD' - deelnemer is in de wacht

  • 'IN_LOBBY': deelnemer wacht in de lobby om toegelaten te worden. Momenteel alleen gebruikt in teams-interopscenario

  • 'VERBINDING VERBROKEN' - eindstatus - deelnemer is niet verbonden met het gesprek

  • Als u wilt weten waarom een deelnemer de oproep heeft verlaten, controleer dan de eigenschap callEndReason.

    CallEndReason callEndReason = remoteParticipant.getCallEndReason();
    
  • Als u wilt controleren of deze externe deelnemer is gedempt of niet, controleert u de isMuted eigenschap:

    boolean isParticipantMuted = remoteParticipant.isMuted();
    
  • Als u wilt controleren of deze externe deelnemer spreekt of niet, inspecteert u de isSpeaking eigenschap:

    boolean isParticipantSpeaking = remoteParticipant.isSpeaking();
    
  • Als u alle videostreams wilt controleren die een bepaalde deelnemer in deze oproep verzendt, controleert u de videoStreams verzameling:

    List<RemoteVideoStream> videoStreams = remoteParticipant.getVideoStreams(); // [RemoteVideoStream, RemoteVideoStream, ...]
    

Dempen andere deelnemers

Notitie

Als u deze API wilt gebruiken, gebruikt u de Azure Communication Services-aanroepende Android SDK versie 2.11.0 of hoger.

Wanneer een PSTN-deelnemer is gedempt, moet hij of zij een aankondiging krijgen dat deze is gedempt en dat ze op een toetsencombinatie (bijvoorbeeld *6) kunnen drukken om het dempen zelf op te heffen. Wanneer ze op *6 drukken, moeten ze worden gedempt.

Als u alle andere deelnemers aan een aanroep wilt dempen, gebruikt u de muteAllRemoteParticipants API voor de aanroep.

call.muteAllRemoteParticipants();

Als u een specifieke externe deelnemer wilt dempen, gebruikt u de mute API voor een bepaalde externe deelnemer.

remoteParticipant.mute();

Informeer de lokale deelnemer dat ze door anderen zijn gedempt door u te abonneren op de onMutedByOthers gebeurtenis.

Foreground Services gebruiken

In gevallen waarin u een zichtbare taak van een gebruiker wilt uitvoeren, zelfs wanneer uw toepassing op de achtergrond is, kunt u Foreground Services gebruiken.

Met Foreground Services kunt u bijvoorbeeld een melding van een gebruiker zichtbaar houden wanneer uw toepassing een actieve aanroep heeft. Op deze manier blijft de aanroep actief, zelfs als de gebruiker naar het startscherm gaat of de toepassing uit het scherm van het recente scherm verwijdert.

Als u tijdens een oproep geen Foreground-service gebruikt, kan het gesprek actief blijven als u naar het startscherm navigeert. Echter, als u de toepassing verwijdert uit het scherm met recente apps, kan de oproep worden beëindigd als het Android-besturingssysteem het proces van uw toepassing beëindigt.

U moet de Foreground-service starten wanneer u een oproep start/deelneemt, bijvoorbeeld:

call = callAgent.startCall(context, participants, options);
startService(yourForegroundServiceIntent);

En stop de voorgrondservice wanneer u het gesprek beëindigt of de oproepstatus verbroken is, bijvoorbeeld:

call.hangUp(new HangUpOptions()).get();
stopService(yourForegroundServiceIntent);

Notities over het gebruik van Foreground Services

Houd er rekening mee dat scenario's zoals het stoppen van een reeds actieve foregroundservice wanneer de app wordt verwijderd uit de lijst met recente apps, de voor de gebruiker zichtbare melding verwijdert en het Android-besturingssysteem het applicatieproces gedurende enige extra tijd actief kan houden, wat betekent dat de oproep gedurende deze periode nog steeds actief kan zijn.

Als uw toepassing bijvoorbeeld de Foreground-service stopt in de onTaskRemoved-methode, kan uw toepassing audio en video starten of stoppen volgens de Activity Lifecycle, zoals het stoppen van audio en video wanneer uw activiteit wordt vernietigd door de onDestroy-methode te overschrijven.

Uw systeem instellen

Volg deze stappen om uw systeem in te stellen.

Het Xcode-project maken

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

U gaat geen tests maken in dit artikel. Schroom niet om het selectievakje Inclusief tests uit te schakelen.

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. Stel de gekoppelde waarde in op een tekenreeks die is 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>. 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 projectbestand ContentView.swift . 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 van 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 dat u hebt gemaakt door aan 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")
        }
})

Notitie

Wanneer de toepassing gedelegeerden implementeert, moet deze een sterke verwijzing bevatten naar de objecten waarvoor gebeurtenisabonnementen zijn vereist. Wanneer bijvoorbeeld een RemoteParticipant object wordt geretourneerd bij het aanroepen van de call.addParticipant methode en de toepassing de verwijzing instelt om te luisteren naar RemoteParticipantDelegate, moet de toepassing een sterke verwijzing naar het RemoteParticipant object houden. Anders, als dit object wordt verzameld, zal de gedelegeerde een fatale uitzondering veroorzaken wanneer de Aanroepende SDK het object probeert aan te roepen.

Een uitgaande oproep plaatsen

Als u een aanroep wilt maken en starten, moet u een van de API's CallAgent aanroepen en de Communication Services-identiteit opgeven van een gebruiker die u hebt ingericht met behulp van de Communication Services Management SDK.

Het maken en starten van oproepen is synchroon. U ontvangt een oproepinstantie dat u toelaat u te abonneren op alle oproepgebeurtenissen.

Een 1:1-oproep naar een gebruiker of een 1:n-oproep plaatsen met gebruikers en PSTN

let callees = [CommunicationUser(identifier: 'UserId')]
self.callAgent?.startCall(participants: callees, options: StartCallOptions()) { (call, error) in
     if error == nil {
         print("Successfully started outgoing call")
         self.call = call
     } else {
         print("Failed to start outgoing call")
     }
}

Een 1:n-oproep plaatsen met gebruikers en PSTN

Notitie

Controleer de details van de aanbieding voor bellen via PSTN. Voor toegang tot het previewprogramma, meld je aan voor het vroege adoptantenprogramma.

Als u de oproep naar PSTN wilt plaatsen, moet u een telefoonnummer opgeven dat is verkregen met Communication Services.

let pstnCallee = PhoneNumberIdentifier(phoneNumber: '+1999999999')
let callee = CommunicationUserIdentifier('UserId')
self.callAgent?.startCall(participants: [pstnCallee, callee], options: StartCallOptions()) { (groupCall, error) in
     if error == nil {
         print("Successfully started outgoing call to multiple participants")
         self.call = groupCall
     } else {
         print("Failed to start outgoing call to multiple participants")
     }
}

Deelnemen aan een chatgesprek

Als u wilt deelnemen aan een room gesprek, geeft u de roomId eigenschap op als de room id. Om deel te nemen aan de oproep, gebruikt u de join-methode en geeft u roomCallLocator door.

func joinRoomCall() {
    if self.callAgent == nil {
        print("CallAgent not initialized")
        return
    }
    
    if (self.roomId.isEmpty) {
        print("Room ID not set")
        return
    }
    
    // Join a call with a Room ID
    let options = JoinCallOptions()
    let audioOptions = AudioOptions()
    audioOptions.muted = self.muted
    
    options.audioOptions = audioOptions
    
    let roomCallLocator = RoomCallLocator(roomId: roomId)
    self.callAgent!.join(with: roomCallLocator, joinCallOptions: options) { (call, error) in
        self.setCallAndObserver(call: call, error: error)
    }
}

Een room biedt toepassingsontwikkelaars betere controle over wie kan deelnemen aan een gesprek, wanneer ze vergaderen en hoe ze samenwerken. Voor meer informatie rooms, kunt u de conceptuele documentatie lezen of de snelstartgids volgen.

Deelnemen aan een groepsgesprek

Als u wilt deelnemen aan een gesprek, moet u een van de API's aanroepen.CallAgent

let groupCallLocator = GroupCallLocator(groupId: UUID(uuidString: "uuid_string")!)
self.callAgent?.join(with: groupCallLocator, joinCallOptions: JoinCallOptions()) { (call, error) in
    if error == nil {
        print("Successfully joined group call")
        self.call = call
    } else {
        print("Failed to join group call")
    }
}

Abonneren op een inkomende oproep

Abonneer u op een binnenkomende oproep gebeurtenis.

final class IncomingCallHandler: NSObject, CallAgentDelegate, IncomingCallDelegate
{
    // Event raised when there is an incoming call
    public func callAgent(_ callAgent: CallAgent, didReceiveIncomingCall incomingcall: IncomingCall) {
        self.incomingCall = incomingcall
        // Subscribe to get OnCallEnded event
        self.incomingCall?.delegate = self
    }

    // Event raised when incoming call was not answered
    public func incomingCall(_ incomingCall: IncomingCall, didEnd args: PropertyChangedEventArgs) {
        print("Incoming call was not answered")
        self.incomingCall = nil
    }
}

Een inkomende oproep accepteren

Als u een aanroep wilt accepteren, roept u de accept methode voor een IncomingCall object aan.

self.incomingCall!.accept(options: AcceptCallOptions()) { (call, error) in
   if (error == nil) {
       print("Successfully accepted incoming call")
       self.call = call
   } else {
       print("Failed to accept incoming call")
   }
}

let firstCamera: VideoDeviceInfo? = self.deviceManager!.cameras.first
localVideoStreams = [LocalVideoStream]()
localVideoStreams!.append(LocalVideoStream(camera: firstCamera!))
let acceptCallOptions = AcceptCallOptions()
acceptCallOptions.videoOptions = VideoOptions(localVideoStreams: localVideoStreams!)
if let incomingCall = self.incomingCall {
    incomingCall.accept(options: acceptCallOptions) { (call, error) in
        if error == nil {
            print("Incoming call accepted")
        } else {
            print("Failed to accept incoming call")
        }
    }
} else {
  print("No incoming call found to accept")
}

Mid-call-bewerkingen uitvoeren

U kunt verschillende bewerkingen uitvoeren tijdens een oproep om instellingen met betrekking tot video en audio te beheren.

Dempen en dempen uitschakelen

Als u het lokale eindpunt wilt dempen of het dempen wilt opheffen, kunt u de asynchrone API's mute en unmute gebruiken.

call!.mute { (error) in
    if error == nil {
        print("Successfully muted")
    } else {
        print("Failed to mute")
    }
}

Gebruik de volgende code om het lokale eindpunt asynchroon te unmuten.

call!.unmute { (error) in
    if error == nil {
        print("Successfully un-muted")
    } else {
        print("Failed to unmute")
    }
}

Externe deelnemers beheren

Alle externe deelnemers worden vertegenwoordigd door het RemoteParticipant type en zijn beschikbaar via de remoteParticipants collectie op een oproepinstantie.

Deelnemers opsommen in een gesprek

call.remoteParticipants

Een deelnemer toevoegen aan een gesprek

Als u een deelnemer wilt toevoegen aan een gesprek (een gebruiker of een telefoonnummer), kunt u aanroepen addParticipant. Met dit commando zal een exemplaar van een externe deelnemer synchroon worden geretourneerd.

let remoteParticipantAdded: RemoteParticipant = call.add(participant: CommunicationUserIdentifier(identifier: "userId"))

Een deelnemer uit een gesprek verwijderen

Als u een deelnemer wilt verwijderen uit een oproep (een gebruiker of een telefoonnummer), kunt u de removeParticipant API aanroepen. Dit wordt asynchroon opgelost.

call!.remove(participant: remoteParticipantAdded) { (error) in
    if (error == nil) {
        print("Successfully removed participant")
    } else {
        print("Failed to remove participant")
    }
}

Eigenschappen van externe deelnemers ophalen

// [RemoteParticipantDelegate] delegate - an object you provide to receive events from this RemoteParticipant instance
var remoteParticipantDelegate = remoteParticipant.delegate

// [CommunicationIdentifier] identity - same as the one used to provision a token for another user
var identity = remoteParticipant.identifier

// ParticipantStateIdle = 0, ParticipantStateEarlyMedia = 1, ParticipantStateConnecting = 2, ParticipantStateConnected = 3, ParticipantStateOnHold = 4, ParticipantStateInLobby = 5, ParticipantStateDisconnected = 6
var state = remoteParticipant.state

// [Error] callEndReason - reason why participant left the call, contains code/subcode/message
var callEndReason = remoteParticipant.callEndReason

// [Bool] isMuted - indicating if participant is muted
var isMuted = remoteParticipant.isMuted

// [Bool] isSpeaking - indicating if participant is currently speaking
var isSpeaking = remoteParticipant.isSpeaking

// RemoteVideoStream[] - collection of video streams this participants has
var videoStreams = remoteParticipant.videoStreams // [RemoteVideoStream, RemoteVideoStream, ...]

Dempen van andere deelnemers

Notitie

Als u deze API wilt gebruiken, dient u versie 2.13.0 of hoger van de Azure Communication Services Calling iOS SDK te gebruiken.

Wanneer een PSTN-deelnemer is gedempt, moet hij of zij een aankondiging krijgen dat deze is gedempt en dat ze op een toetsencombinatie (bijvoorbeeld *6) kunnen drukken om het dempen zelf op te heffen. Wanneer ze op *6 drukken, moeten ze niet meer gedempt zijn.

Als u alle andere deelnemers aan een aanroep wilt dempen, gebruikt u de muteAllRemoteParticipants API voor de aanroep.

call!.muteAllRemoteParticipants { (error) in
    if error == nil {
        print("Successfully muted all remote participants.")
    } else {
        print("Failed to mute remote participants.")
    }
}

Als u een specifieke externe deelnemer wilt dempen, gebruikt u de mute API voor een bepaalde externe deelnemer.

remoteParticipant.mute { (error) in
    if error == nil {
        print("Successfully muted participant.")
    } else {
        print("Failed to mute participant.")
    }
}

Om de lokale deelnemer te informeren dat deze door anderen is gedempt, abonneert u zich op het onMutedByOthers evenement.

Uw systeem instellen

Volg deze stappen om uw systeem in te stellen.

Het Visual Studio-project maken

Voor een Universal Windows Platform-app maakt u in Visual Studio 2022 een nieuw Blanke App (Universal Windows)-project aan. 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.

Zoek, download en installeer het Calling SDK NuGet-pakket.

  1. Open NuGet Pakketbeheerder door Tools>NuGet Pakketbeheer>Beheer NuGet-pakketten voor oplossing te selecteren.
  2. Selecteer Bladeren en voer vervolgens Azure.Communication.Calling.WindowsClient in het zoekvak in.
  3. Zorg ervoor dat het selectievakje Voorlopige versies opnemen is ingeschakeld.
  4. Selecteer het pakket Azure.Communication.Calling.WindowsClient en selecteer vervolgens Azure.Communication.Calling.WindowsClient1.4.0-beta.1 of een nieuwere versie.
  5. Schakel het selectievakje in dat overeenkomt met het Azure Communication Services-project in het rechterdeelvenster.
  6. Selecteer Installeren.

Toegang tot de microfoon aanvragen

De app heeft toegang tot de microfoon nodig om goed te werken. In UWP-apps moet de microfoonfunctie worden gedeclareerd in het manifestbestand van de app.

In de volgende stappen ziet u hoe u dat kunt bereiken.

  1. Dubbelklik in het Solution Explorer deelvenster op het bestand met .appxmanifest extensie.
  2. Klik op het Capabilities tabblad.
  3. Schakel het Microphone selectievakje in de lijst met mogelijkheden in.

UI-knoppen maken om de oproep te starten en op te hangen

Deze eenvoudige voorbeeld-app bevat twee knoppen. Een voor het plaatsen van de oproep en een tweede om een gesprek op te hangen. In de volgende stappen ziet u hoe u deze knoppen aan de app toevoegt.

  1. Dubbelklik in het Solution Explorer deelvenster op het bestand met de naam MainPage.xaml UWP of MainWindows.xaml voor WinUI 3.
  2. Zoek in het centrale deelvenster naar de XAML-code onder de preview-versie van de gebruikersinterface.
  3. Wijzig de XAML-code door het volgende fragment:
<TextBox x:Name="CalleeTextBox" PlaceholderText="Who would you like to call?" />
<StackPanel>
    <Button x:Name="CallButton" Content="Start/Join call" Click="CallButton_Click" />
    <Button x:Name="HangupButton" Content="Hang up" Click="HangupButton_Click" />
</StackPanel>

De app instellen met oproep-SDK-API's

De CALLING SDK-API's bevinden zich in twee verschillende naamruimten. De volgende stappen informeren de C#-compiler over deze naamruimten, zodat De IntelliSense van Visual Studio kan helpen bij het ontwikkelen van code.

  1. Klik in het Solution Explorer deelvenster op de pijl aan de linkerkant van het bestand met de naam MainPage.xaml UWP of MainWindows.xaml voor WinUI 3.
  2. Dubbelklik op bestand met de naam MainPage.xaml.cs of MainWindows.xaml.cs.
  3. Voeg de volgende opdrachten onder aan de huidige using instructies toe.
using Azure.Communication.Calling.WindowsClient;

Houd MainPage.xaml.cs of MainWindows.xaml.cs open. In de volgende stappen wordt er meer code aan toegevoegd.

App-interacties toestaan

De knoppen van de gebruikersinterface die eerder zijn toegevoegd, moeten boven op een geplaatste CommunicationCallknop werken. Dit betekent dat een CommunicationCall gegevenslid moet worden toegevoegd aan de MainPage of MainWindow klasse. Daarnaast, om de asynchrone bewerking die CallAgent creëert te laten slagen, moet er ook een CallAgent datalid aan dezelfde klasse worden toegevoegd.

Voeg de volgende gegevensleden toe aan de MainPage pr-klasse MainWindow :

CallAgent callAgent;
CommunicationCall call;

Knophandlers maken

Voorheen werden twee UI-knoppen toegevoegd aan de XAML-code. Met de volgende code worden de handlers toegevoegd die moeten worden uitgevoerd wanneer een gebruiker de knop selecteert. De volgende code moet worden toegevoegd na de gegevensleden uit de vorige sectie.

private async void CallButton_Click(object sender, RoutedEventArgs e)
{
    // Start call
}

private async void HangupButton_Click(object sender, RoutedEventArgs e)
{
    // End the current call
}

Objectmodel

De volgende klassen en interfaces verwerken enkele van de belangrijkste functies van de Clientbibliotheek voor aanroepen van Azure Communication Services voor UWP.

Name Beschrijving
CallClient Het CallClient is het belangrijkste toegangspunt voor de clientbibliotheek voor aanroepen.
CallAgent Het CallAgent wordt gebruikt om oproepen te starten en eraan deel te nemen.
CommunicationCall Het CommunicationCall wordt gebruikt voor het beheren van geplaatste of gekoppelde oproepen.
CommunicationTokenCredential De CommunicationTokenCredential wordt gebruikt als tokenreferentie-credential om de CallAgent te initialiseren.
CallAgentOptions De CallAgentOptions bevat informatie om de beller te identificeren.
HangupOptions De HangupOptions informeert alle deelnemers indien een oproep moet worden beëindigd.

De CallAgent initialiseren

Om een CallAgent exemplaar van CallClient te maken, moet u de methode CallClient.CreateCallAgentAsync gebruiken die asynchroon een CallAgent object retourneert zodra het is geïnitialiseerd.

Als u wilt maken CallAgent, moet u een CallTokenCredential object en een CallAgentOptions object doorgeven. Houd er rekening mee dat CallTokenCredential een foutmelding geeft als er een onjuist token wordt doorgegeven.

De volgende code moet worden toegevoegd in de helperfunctie die moet worden aangeroepen in de initialisatie van de app.

var callClient = new CallClient();
this.deviceManager = await callClient.GetDeviceManagerAsync();

var tokenCredential = new CallTokenCredential("<AUTHENTICATION_TOKEN>");
var callAgentOptions = new CallAgentOptions()
{
    DisplayName = "<DISPLAY_NAME>"
};

this.callAgent = await callClient.CreateCallAgentAsync(tokenCredential, callAgentOptions);

Wijzig het <AUTHENTICATION_TOKEN> met een geldig referentietoken voor uw resource. Raadpleeg de documentatie van het gebruikerstoegangstoken als er een referentietoken moet worden opgehaald.

CallAgent maken en een oproep plaatsen

De objecten die nodig zijn om een CallAgent te maken, zijn nu gereed. Het is tijd om asynchroon CallAgent aan te maken en een oproep te plaatsen.

De volgende code moet worden toegevoegd nadat de uitzondering van de vorige stap is verwerkt.

var startCallOptions = new StartCallOptions();
var callees = new [] { new UserCallIdentifier(CalleeTextBox.Text.Trim()) };

this.call = await this.callAgent.StartCallAsync(callees, startCallOptions);
this.call.OnStateChanged += Call_OnStateChangedAsync;

Gebruik gerust 8:echo123 om de Azure Communication Services echo-bot te benaderen.

Dempen en dempen ongedaan maken

Als u de uitgaande audio wilt dempen of het dempen wilt opheffen, kunt u de MuteOutgoingAudioAsync en UnmuteOutgoingAudioAsync asynchrone API's gebruiken.

// mute outgoing audio
await this.call.MuteOutgoingAudioAsync();

// unmute outgoing audio
await this.call.UnmuteOutgoingAudioAsync();

Andere deelnemers dempen

Notitie

Als u deze API wilt gebruiken, gebruikt u azure Communication Services die Windows SDK-versie 1.9.0 of hoger aanroepen.

Wanneer een PSTN-deelnemer is gedempt, moet hij of zij een aankondiging krijgen dat deze is gedempt en dat ze op een toetsencombinatie (bijvoorbeeld *6) kunnen drukken om het dempen zelf op te heffen. Wanneer ze op *6 drukken, moeten ze worden gedempt.

Als u alle andere deelnemers wilt dempen of een specifieke deelnemer wilt dempen, kunt u de asynchrone API's MuteAllRemoteParticipantsAsync voor het gesprek en MuteAsync de externe deelnemer gebruiken:

// mute all participants except yourself
await this.call.MuteAllRemoteParticipantsAsync();

// mute specific participant in the call
await this.call.RemoteParticipants.FirstOrDefault().MuteAsync();

Als u de lokale deelnemer wilt informeren dat deze door anderen is gedempt, abonneert u zich op de MutedByOthers gebeurtenis.

Een gesprek beëindigen

Zodra een aanroep is geplaatst, moet de HangupAsync methode van het CommunicationCall object worden gebruikt om de aanroep op te hangen.

Er moet ook een instantie van HangupOptions worden gebruikt om mede te delen of de oproep voor alle deelnemers beëindigd moet worden.

De volgende code moet binnen HangupButton_Clickworden toegevoegd.

this.call.OnStateChanged -= Call_OnStateChangedAsync;
await this.call.HangUpAsync(new HangUpOptions() { ForEveryone = false });

De code uitvoeren

Zorg ervoor dat Visual Studio de app bouwt voor x64, x86 of ARM64klik F5 vervolgens om de app uit te voeren. Klik daarna op de Call knop om een oproep te plaatsen naar de opgegeven ontvanger.

Houd er rekening mee dat de eerste keer dat de app wordt uitgevoerd, de gebruiker wordt gevraagd om toegang te verlenen tot de microfoon.

Volgende stappen