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

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:

Verbonden : 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 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 call het exemplaar kunt u zich abonneren op oproepevenementen.

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

Als u een andere Communication Services-gebruiker wilt aanroepen, gebruikt u de startCall methode aan 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 aan callAgent en geeft u de geadresseerde PhoneNumberIdentifierdoor. 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 preview-programmatoegang is dit van toepassing op het early adopter-programma.

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 . Als u wilt deelnemen aan de aanroep, gebruikt u de join methode en geeft u het contextexemplaren 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 bevat een incomingCall exemplaar dat u kunt accepteren of weigeren.

De Azure Communication Calling SDK roept een cameraStartFailed op: waar gespreksdiagnose als de camera niet beschikbaar is bij het starten, accepteren of deelnemen aan een gesprek met video ingeschakeld. In dit geval begint het gesprek met video uit. De camera is mogelijk niet beschikbaar omdat deze wordt gebruikt door een ander proces of omdat deze is uitgeschakeld in het besturingssysteem.

Oproep in wachtstand houden en hervatten

Notitie

Op een bepaald moment mag er slechts 1 actieve oproep zijn (met Connected actieve media). Alle andere aanroepen moeten in bewaring worden geplaatst door een gebruiker of programmatisch per toepassing. 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 bewaring houden

await call.hold();

Wanneer hold de API wordt omgezet, 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 LocalHoldzou leiden. In een groepsgesprek of -vergadering: het hold is een lokale bewerking, maar houdt de oproep voor andere deelnemers niet in de wacht. Als u de oproep wilt hervatten, moeten alle gebruikers die bewaring hebben gestart, deze hervatten.

Ga als volgende te werk om de oproep vanuit de wachtstand te hervatten:

await call.resume();

Wanneer de resume API wordt omgezet, wordt de aanroepstatus opnieuw ingesteld op Connected.

Een oproep dempen en het dempen opheffen

Als u het lokale eindpunt wilt dempen of dempen wilt opheffen, kunt u de mute api's 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 dempen opheffen

Als u binnenkomende audio dempt, wordt het oproepvolume ingesteld op 0. Als u de binnenkomende audio wilt dempen of de dempen wilt opheffen, kunt u de muteIncomingAudio api's en unmuteIncomingAudio asynchrone API's 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 verzameling op een oproepexemplaren. De remoteParticipants is toegankelijk vanuit een Call exemplaar.

De deelnemers in een gesprek weergeven

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 instantie wordt synchroon geretourneerd remoteParticipant . De remoteParticipantsUpdated gebeurtenis van gesprek wordt gegenereerd wanneer een deelnemer 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 id 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 gaat over.
    • 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, wordt de status na twee minuten gewijzigd 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: Als u de weergavenaam voor deze externe deelnemer wilt ophalen, inspecteert u displayName de eigenschap die de tekenreeks retourneert.

    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 in de oproep van veel eindpunten zijn 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 zijn verbonden met een gesprek, kunt u de asynchrone API's muteAllRemoteParticipants voor het gesprek en mute de externe deelnemer gebruiken. De mutedByOthers gebeurtenis van Gesprek wordt gegenereerd 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 aanroep 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 ophalen:

const callInfo = call.info;

Meer informatie over andere deelnemers aan de oproep door de remoteParticipants verzameling te inspecteren op het 'oproepexemplaren':

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 kant.
  • 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 zet. 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 streams voor het delen van schermen 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 retourneert Boolean.

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;

Installeer de SDK

Zoek het bestand op projectniveau build.gradle en voeg deze toe aan mavenCentral() 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 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();

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 aanroepexemplaren kunt u zich abonneren op alle gebeurtenissen in 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 preview-programmatoegang is dit van toepassing op het early adopter-programma.

Als u een oproep van 1:n naar een gebruiker en een PSTN-nummer wilt plaatsen, moet u het telefoonnummer van de oproep 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 aanroep op:

String callId = call.getId();

Voor meer informatie over andere deelnemers in de oproep inspecteerverzameling remoteParticipant op het call exemplaar:

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

De identiteit van de beller als de oproep binnenkomt:

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

De status van de oproep ophalen:

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' - oproep is verbonden
  • 'LOCAL_HOLD': oproep wordt in de wacht gezet door lokale deelnemer, er stroomt geen media tussen het lokale eindpunt en de externe deelnemer(s)
  • 'REMOTE_HOLD': oproep wordt in de wacht gezet door een externe deelnemer, er loopt geen media tussen het lokale eindpunt en de externe deelnemer(s)
  • 'VERBINDING VERBREKEN': overgangsstatus voordat de aanroep de status Verbroken wordt
  • 'VERBINDING VERBROKEN' - eindoproepstatus
  • 'IN_LOBBY': in de lobby voor een interoperabiliteit van Teams-vergaderingen

Als u wilt weten waarom een oproep is beëindigd, inspecteert u callEndReason de eigenschap. Deze 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 dempen opheffen

Als u het lokale eindpunt wilt dempen of dempen wilt opheffen, kunt u de mute api's 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 het type en zijn beschikbaar via de remoteParticipants verzameling op een oproepexemplaren.

Deelnemers weergeven in een gesprek

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 id voor deze externe deelnemer op. Identiteit is een van de id-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 bewaring

  • 'IN_LOBBY': deelnemer wacht in de lobby om toe te staan. 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, inspecteert u callEndReason de eigenschap:

    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, ...]
    

Andere deelnemers dempen

Notitie

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

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

Als u de lokale deelnemer wilt informeren dat deze door anderen is gedempt, abonneert u zich 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 geen Foreground-service gebruikt tijdens een gesprek, kan het actief blijven als u naar het startscherm navigeert, maar als u de toepassing verwijdert uit het scherm van het recente scherm, kan de aanroep worden gestopt 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 Foreground-service wanneer u de oproep vasthangt of de status van de oproep is verbroken, 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 uitgevoerde Foreground-service wanneer de app wordt verwijderd uit de lijst met recente bestanden, de zichtbare melding van de gebruiker verwijdert en het Android-besturingssysteem het toepassingsproces gedurende enige extra tijd actief kan houden, wat betekent dat de aanroep gedurende deze periode nog steeds actief kan zijn.

Als uw toepassing bijvoorbeeld de Foreground-service op de servicemethode onTaskRemoved stopt, kan uw toepassing audio en video starten/stoppen volgens uw levenscyclus van activiteiten, zoals het stoppen van audio en video wanneer uw activiteit wordt vernietigd met de onDestroy methode 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. 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. 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>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 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 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")
        }
})

Notitie

Wanneer de toepassing gedelegeerden implementeert, moet deze een sterke verwijzing bevatten naar de objecten waarvoor gebeurtenisabonnementen zijn vereist. Wanneer een RemoteParticipant object bijvoorbeeld wordt geretourneerd bij het aanroepen van de call.addParticipant methode en de toepassing de gemachtigde instelt om op te luisteren RemoteParticipantDelegate, moet de toepassing een sterke verwijzing naar het RemoteParticipant object bevatten. Als dit object wordt verzameld, genereert de gemachtigde een fatale uitzondering 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 oproepexemplaren waarmee u zich kunt abonneren op alle gebeurtenissen in de oproep.

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 preview-programmatoegang is dit van toepassing op het early adopter-programma.

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. Als u wilt deelnemen aan de aanroep, gebruikt u de join methode en geeft u de roomCallLocator.

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 gebeurtenis voor binnenkomende oproepen.

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-callbewerkingen uitvoeren

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

Dempen en dempen opheffen

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

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

Gebruik de volgende code om het dempen van het lokale eindpunt asynchroon op te heffen.

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 verzameling op een oproepexemplaren.

Deelnemers weergeven 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 deze opdracht wordt een exemplaar van een externe deelnemer synchroon 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, ...]

Andere deelnemers dempen

Notitie

Als u deze API wilt gebruiken, gebruikt u de Azure Communication Services die iOS SDK-versie 2.13.0 of hoger aanroepen.

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

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

Uw systeem instellen

Volg deze stappen om uw systeem in te stellen.

Het Visual Studio-project maken

Voor een Universeel Windows-platform-app maakt u 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.

Het NuGet-pakket voor aanroepende SDK zoeken, downloaden en installeren:

  1. Open NuGet Pakketbeheer door Tools>NuGet Pakketbeheer> Manage NuGet Packages for Solution te selecteren.
  2. Selecteer Bladeren en voer vervolgens Azure.Communication.Calling.WindowsClient in het zoekvak in.
  3. Zorg ervoor dat het selectievakje Voorlopige versie opnemen is ingeschakeld.
  4. Selecteer het pakket Azure.Communication.Calling.WindowsClient en selecteer vervolgens Azure.Communication.Calling.WindowsClient 1.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

Voor de app is toegang tot de microfoon vereist om goed te kunnen worden uitgevoerd. 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 het gesprek te plaatsen en op te hangen

Deze eenvoudige voorbeeld-app bevat twee knoppen. Een voor het plaatsen van de oproep en een andere om een geplaatst 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 SDK-API's voor aanroepen

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 moet een CallAgent gegevenslid worden toegevoegd aan dezelfde klasse om de asynchrone bewerking CallAgent te laten slagen.

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 de tokenreferentie om de CallAgent.
CallAgentOptions De CallAgentOptions bevat informatie om de beller te identificeren.
HangupOptions De HangupOptions meldingen als een oproep moet worden beëindigd aan alle deelnemers.

De CallAgent initialiseren

Als u een CallAgent exemplaar CallClientwilt maken, moet u een methode gebruiken CallClient.CreateCallAgentAsync 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 er een ongeldig 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 te CallAgent maken, zijn nu gereed. Het is tijd om asynchroon een aanroep te maken CallAgent en 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;

Neem gerust contact 8:echo123 op met de Azure Communication Services-echobot.

Dempen en dempen opheffen

Als u de uitgaande audio wilt dempen of het dempen wilt opheffen, kunt u de MuteOutgoingAudioAsync api's 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.

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 te informeren of de oproep moet worden beëindigd voor alle deelnemers.

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 naar de opgegeven aanroep te plaatsen.

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