Hantera anrop
Lär dig hur du hanterar samtal med Azure Communication Services SDKS. Vi får lära oss hur du ringer samtal, hanterar deras deltagare och egenskaper.
Förutsättningar
- Ett Azure-konto med en aktiv prenumeration. Skapa ett konto utan kostnad.
- En distribuerad Communication Services-resurs. Skapa en Communication Services-resurs.
- A
User Access Token
för att aktivera anropsklienten. Mer information om hur du får enUser Access Token
- Valfritt: Slutför snabbstarten för att komma igång med att lägga till samtal i ditt program
Installera SDK:n
npm install
Använd kommandot för att installera Azure Communication Services Common och Calling SDK för JavaScript:
npm install @azure/communication-common --save
npm install @azure/communication-calling --save
Initiera nödvändiga objekt
En CallClient
instans krävs för de flesta anropsåtgärder. När du skapar en ny CallClient
instans kan du konfigurera den med anpassade alternativ som en Logger
instans.
Med instansen CallClient
kan du skapa en CallAgent
instans genom att anropa createCallAgent
. Den här metoden returnerar asynkront ett CallAgent
instansobjekt.
Metoden createCallAgent
använder CommunicationTokenCredential
som argument. Den accepterar en användaråtkomsttoken.
Du kan använda getDeviceManager
metoden på instansen CallClient
för att få åtkomst deviceManager
till .
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()
Så här hanterar du SDK-anslutning till Microsoft-infrastruktur på bästa sätt
Instansen Call Agent
hjälper dig att hantera anrop (för att ansluta eller starta samtal). För att kunna arbeta måste din anropande SDK ansluta till Microsofts infrastruktur för att få meddelanden om inkommande samtal och samordna annan samtalsinformation. Du Call Agent
har två möjliga tillstånd:
Ansluten – Ett Call Agent
connectionStatue-värde Connected
innebär att klient-SDK:t är anslutet och kan ta emot meddelanden från Microsofts infrastruktur.
Frånkopplad – Ett Call Agent
connectionStatue-värde för Disconnected
tillstånd det finns ett problem som hindrar SDK:n från att ansluta korrekt. Call Agent
ska återskapas.
invalidToken
: Om en token har upphört att gälla eller om en ogiltigCall Agent
instans kopplas från med det här felet.connectionIssue
: Om det finns ett problem med att klienten ansluter till Microsoft-infrastrukturen, efter att många återförsökCall Agent
har exponeratconnectionIssue
felet.
Du kan kontrollera om din lokala Call Agent
är ansluten till Microsofts infrastruktur genom att granska det aktuella värdet för connectionState
egenskapen. Under ett aktivt anrop kan du lyssna på connectionStateChanged
händelsen för att avgöra om Call Agent
det ändras från Anslutet till frånkopplat tillstånd.
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);
Ringa ett samtal
Om du vill skapa och starta ett anrop använder du ett av API:erna på callAgent
och anger en användare som du har skapat via Communication Services identitets-SDK.
Skapande och start av samtal är synkrona. Med instansen call
kan du prenumerera på samtalshändelser.
Placera ett 1:n-anrop till en användare eller PSTN
Om du vill anropa en annan Communication Services-användare använder startCall
du metoden på callAgent
och skickar mottagarens som du skapade med administrationsbiblioteketCommunicationUserIdentifier
för Kommunikationstjänster.
För ett "1:1"-anrop till en användare använder du följande kod:
const userCallee = { communicationUserId: '<ACS_USER_ID>' }
const oneToOneCall = callAgent.startCall([userCallee]);
Om du vill ringa till ett offentligt kopplat telefonnät (PSTN) använder du startCall
metoden på callAgent
och skickar mottagarens PhoneNumberIdentifier
. Din Communication Services-resurs måste konfigureras för att tillåta PSTN-samtal.
När du anropar ett PSTN-nummer anger du ditt alternativa nummerpresentation. Ett alternativt nummerpresentation är ett telefonnummer (baserat på E.164-standarden) som identifierar anroparen i ett PSTN-samtal. Det är det telefonnummer som samtalsmottagaren ser för ett inkommande samtal.
Kommentar
Kontrollera information om PSTN-samtalserbjudandet. För förhandsversion av programåtkomst gäller du för det tidiga adopterprogrammet.
För ett 1:1-anrop till ett PSTN-nummer använder du följande kod:
const pstnCallee = { phoneNumber: '<ACS_USER_ID>' }
const alternateCallerId = {phoneNumber: '<ALTERNATE_CALLER_ID>'};
const oneToOneCall = callAgent.startCall([pstnCallee], { alternateCallerId });
Använd följande kod för ett 1:n-anrop till en användare och ett 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 });
Ansluta till ett rumssamtal
Om du vill ansluta till ett room
anrop kan du instansiera ett kontextobjekt med roomId
egenskapen som room
identifierare. Om du vill ansluta till anropet join
använder du metoden och skickar kontextinstansen.
const context = { roomId: '<RoomId>' }
const call = callAgent.join(context);
En room
ger programutvecklare bättre kontroll över vem som kan ansluta till ett samtal, när de träffas och hur de samarbetar. Om du vill veta mer om rooms
kan du läsa den konceptuella dokumentationen eller följa snabbstartsguiden.
Ansluta till ett gruppsamtal
Kommentar
Parametern groupId
betraktas som systemmetadata och kan användas av Microsoft för åtgärder som krävs för att köra systemet. Inkludera inte personliga data i värdet groupId
. Microsoft behandlar inte den här parametern som personuppgifter och dess innehåll kan vara synligt för Microsoft-anställda eller lagras långsiktigt.
Parametern groupId
kräver att data är i GUID-format. Vi rekommenderar att du använder slumpmässigt genererade GUID:er som inte betraktas som personuppgifter i dina system.
Om du vill starta ett nytt gruppanrop eller ansluta till ett pågående gruppanrop använder du join
metoden och skickar ett objekt med en groupId
egenskap. Värdet groupId
måste vara ett GUID.
const context = { groupId: '<GUID>'};
const call = callAgent.join(context);
Ta emot inkommande samtal
Instansen callAgent
genererar en incomingCall
händelse när den inloggade identiteten tar emot ett inkommande samtal. Om du vill lyssna på den här händelsen prenumererar du med något av följande alternativ:
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);
Händelsen incomingCall
innehåller en incomingCall
instans som du kan acceptera eller avvisa.
Azure Communication Calling SDK höjer en kameraStartFailed: sann samtalsdiagnostik om kameran inte är tillgänglig när du startar, accepterar eller ansluter ett samtal med video aktiverat. I det här fallet börjar samtalet med video av. Kameran kanske inte är tillgänglig eftersom den används av en annan process eller för att den är inaktiverad i operativsystemet.
Pausa och återuppta anrop
Kommentar
Vid en viss tidpunkt bör det bara finnas ett aktivt anrop (i Connected
tillstånd, med aktiva medier). Alla andra anrop bör spärras av en användare eller programmässigt av program. Detta är vanligt i scenarier som kontaktcenter, där en användare kan behöva hantera flera utgående och inkommande anrop, alla inaktiva anrop bör spärras och användaren bör endast interagera med andra i aktivt anrop
Om du vill behålla eller återuppta anropet kan du använda de hold
asynkrona resume
API:erna:
Så här håller du samtalet
await call.hold();
När hold
API:et matchar är anropstillståndet inställt på LocalHold
. I ett 1:1-samtal spärras även den andra deltagaren, och tillståndet för samtalet från deltagarens perspektiv är inställt på "RemoteHold". Senare kan den andra deltagaren lägga sitt anrop på is, vilket skulle resultera i en tillståndsändring till LocalHold
.
I ett gruppsamtal eller möte – hold
är en lokal åtgärd, den håller inte samtalet för andra samtalsdeltagare.
Om du vill återuppta anropet måste alla användare som initierade undantaget återuppta det.
Så här återupptar du anropet från undantag:
await call.resume();
När API:et resume
matchar anges anropstillståndet igen till Connected
.
Stäng av och slå på ljudet för ett anrop
Om du vill stänga av eller slå på den lokala slutpunkten kan du använda de mute
asynkrona API:erna:unmute
//mute local device (microphone / sent audio)
await call.mute();
//unmute local device (microphone / sent audio)
await call.unmute();
Stäng av och slå på inkommande ljud
Ljudavstängning av inkommande ljud ställer in samtalsvolymen på 0. Om du vill stänga av eller slå på ljudet från inkommande ljud kan du använda de muteIncomingAudio
asynkrona API:erna:unmuteIncomingAudio
//mute local device (speaker)
await call.muteIncomingAudio();
//unmute local device (speaker)
await call.unmuteIncomingAudio();
När inkommande ljud är avstängt tar deltagarens klient-SDK fortfarande emot samtalsljudet (fjärrdeltagarens ljud). Samtalsljudet hörs inte i talaren och deltagaren kan inte lyssna förrän "call.unmuteIncomingAudio()" anropas. Vi kan dock använda filter på samtalsljud och spela upp det filtrerade ljudet.
Hantera fjärrdeltagare
Alla fjärrdeltagare beskrivs i RemoteParticipant
objektet och är tillgängliga via remoteParticipants
samlingen på en samtalsinstans. remoteParticipants
Är tillgänglig från en Call
instans.
Visa en lista över deltagarna i ett samtal
Samlingen remoteParticipants
returnerar en lista över fjärranslutna deltagare i ett anrop:
call.remoteParticipants; // [remoteParticipant, remoteParticipant....]
Lägga till en deltagare i ett anrop
Om du vill lägga till en deltagare (antingen en användare eller ett telefonnummer) i ett samtal kan du använda API:et addParticipant
. Ange en av typerna Identifier
. Den returnerar synkront instansen remoteParticipant
. Händelsen remoteParticipantsUpdated
från anropet aktiveras när en deltagare har lagts till i anropet.
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 });
Ta bort en deltagare från ett anrop
Om du vill ta bort en deltagare (antingen en användare eller ett telefonnummer) från ett samtal kan du anropa removeParticipant
. Du måste skicka en av typerna Identifier
. Den här metoden löser asynkront när deltagaren har tagits bort från anropet. Deltagaren tas också bort från remoteParticipants
samlingen.
const userIdentifier = { communicationUserId: '<ACS_USER_ID>' };
const pstnIdentifier = { phoneNumber: '<PHONE_NUMBER>' }
await call.removeParticipant(userIdentifier);
await call.removeParticipant(pstnIdentifier);
Åtkomst till egenskaper för fjärrdeltagare
Fjärrdeltagare har en uppsättning associerade egenskaper och samlingar:
CommunicationIdentifier
: Hämta identifieraren för en fjärrdeltagare. Identitet är en av typernaCommunicationIdentifier
:
const identifier = remoteParticipant.identifier;
Det kan vara en av följande
CommunicationIdentifier
typer:{ communicationUserId: '<ACS_USER_ID'> }
: Objekt som representerar Azure Communication Services-användaren.{ phoneNumber: '<E.164>' }
: Objekt som representerar telefonnumret i E.164-format.{ microsoftTeamsUserId: '<TEAMS_USER_ID>', isAnonymous?: boolean; cloud?: "public" | "dod" | "gcch" }
: Objekt som representerar Teams-användaren.{ id: string }
: objekt som representerar identifierare som inte passar någon av de andra identifierartyperna
state
: Hämta tillståndet för en fjärrdeltagare.
const state = remoteParticipant.state;
Tillståndet kan vara:
Idle
: Ursprungligt tillstånd.Connecting
: Övergångstillstånd när en deltagare ansluter till anropet.Ringing
: Deltagaren ringer.Connected
: Deltagaren är ansluten till samtalet.Hold
: Deltagaren är spärrad.EarlyMedia
: Meddelande som spelas upp innan en deltagare ansluter till anropet.InLobby
: Anger att fjärrdeltagaren är i lobbyn.Disconnected
: Slutligt tillstånd. Deltagaren är frånkopplad från anropet. Om fjärrdeltagaren förlorar sin nätverksanslutning ändras deras tillstånd tillDisconnected
efter två minuter.
callEndReason
: Om du vill veta varför en deltagare lämnade samtalet kontrollerar du egenskapencallEndReason
:const callEndReason = remoteParticipant.callEndReason; const callEndReasonCode = callEndReason.code // (number) code associated with the reason const callEndReasonSubCode = callEndReason.subCode // (number) subCode associated with the reason
Obs!
- Den här egenskapen anges bara när du lägger till en fjärrdeltagare via API:et Call.addParticipant() och fjärrdeltagaren avböjer till exempel.
- I scenariot, där UserB sparkar UserC, från UserA:s perspektiv, ser UserA inte den här flaggan för UserC. UserA ser med andra ord inte att UserC:s callEndReason-egenskap ställs in alls.
isMuted
status: Om du vill ta reda på om en fjärrdeltagare är avstängd kontrollerar du egenskapenisMuted
. Den returnerarBoolean
.const isMuted = remoteParticipant.isMuted;
isSpeaking
status: Om du vill ta reda på om en fjärrdeltagare talar kontrollerar du egenskapenisSpeaking
. Den returnerarBoolean
.const isSpeaking = remoteParticipant.isSpeaking;
videoStreams
: Kontrollera samlingen om du vill kontrollera alla videoströmmar som en viss deltagare skickar i det här anropetvideoStreams
. Den innehållerRemoteVideoStream
objekt.const videoStreams = remoteParticipant.videoStreams; // [RemoteVideoStream, ...]
displayName
: Om du vill hämta visningsnamnet för den här fjärrdeltagaren kontrollerar dudisplayName
egenskapen som returnerar strängen.const displayName = remoteParticipant.displayName;
endpointDetails
: Hämta information om alla slutpunkter för den här fjärrdeltagarenconst endpointDetails: EndpointDetails[] = remoteParticipant.endpointDetails;
Obs! En fjärrdeltagare kan vara i anropet från många slutpunkter och varje slutpunkt har sin egen unika
participantId
.participantId
skiljer sig från RemoteParticipant.identifiers rå-ID.
Stäng av ljudet för andra deltagare
Kommentar
Om du vill använda det här API:et använder du Azure Communication Services Calling Web SDK version 1.26.1 eller senare.
Om du vill stänga av ljudet för alla andra deltagare eller stänga av ljudet för en specifik deltagare som är ansluten till ett anrop kan du använda asynkrona API:er muteAllRemoteParticipants
för anropet och mute
på fjärrdeltagaren. Händelsen mutedByOthers
från anropet aktiveras när den lokala deltagaren har stängts av av andra.
Obs! Scenarier för att stänga av PSTN-deltagare (telefonnummer) eller 1:1-samtalsdeltagare stöds inte.
//mute all participants except yourself
await call.muteAllRemoteParticipants();
//mute a specific participant
await call.remoteParticipants[0].mute();
Kontrollera anropsegenskaper
Hämta det unika ID:t (strängen) för ett anrop:
const callId: string = call.id;
Hämta det lokala deltagar-ID:t:
const participantId: string = call.info.participantId;
Obs! En Azure Communication Services-identitet kan använda SDK för webbsamtal i många slutpunkter och varje slutpunkt har sin egen unika participantId
. participantId
skiljer sig från det råa identitets-ID:t för Azure Communication Services.
Hämta tråd-ID:t om du ansluter till ett Teams-möte:
const threadId: string | undefined = call.info.threadId;
Hämta information om samtalet:
const callInfo = call.info;
Lär dig mer om andra deltagare i samtalet genom att remoteParticipants
granska samlingen på "samtalsinstansen":
const remoteParticipants = call.remoteParticipants;
Identifiera anroparen för ett inkommande samtal:
const callerIdentity = call.callerInfo.identifier;
identifier
är en av typerna CommunicationIdentifier
.
Hämta tillståndet för ett samtal:
const callState = call.state;
Detta returnerar en sträng som representerar det aktuella tillståndet för ett anrop:
None
: Inledande anropstillstånd.Connecting
: Inledande övergångstillstånd när ett anrop görs eller godkänns.Ringing
: För ett utgående samtal anger att ett samtal ringer för fjärrdeltagare. Det ärIncoming
på deras sida.EarlyMedia
: Anger ett tillstånd där ett meddelande spelas upp innan samtalet ansluts.Connected
: Anger att anropet är anslutet.LocalHold
: Anger att en lokal deltagare som samtalet spärrade samtalet. Inget media flödar mellan den lokala slutpunkten och fjärrdeltagarna.RemoteHold
: Anger att en fjärrdeltagare som samtalet spärrade samtalet. Inget media flödar mellan den lokala slutpunkten och fjärrdeltagarna.InLobby
: Anger att användaren är i lobbyn.Disconnecting
: Övergångstillstånd innan anropet går till ettDisconnected
tillstånd.Disconnected
: Slutligt anropstillstånd. Om nätverksanslutningen går förlorad ändras tillståndet tillDisconnected
efter två minuter.
Ta reda på varför ett samtal avslutades genom att inspektera egenskapen callEndReason
:
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
Lär dig om det aktuella samtalet är inkommande eller utgående genom att granska egenskapen direction
. Den returnerar CallDirection
.
const isIncoming = call.direction == 'Incoming';
const isOutgoing = call.direction == 'Outgoing';
Granska aktiva videoströmmar och aktiva skärmdelningsströmmar genom att kontrollera localVideoStreams
samlingen. API:et localVideoStreams
returnerar LocalVideoStream
objekt av typen Video
, ScreenSharing
eller RawMedia
.
const localVideoStreams = call.localVideoStreams;
Kontrollera om den aktuella mikrofonen är avstängd. Den returnerar Boolean
.
const muted = call.isMuted;
Kontrollera om det aktuella inkommande ljudet (högtalaren) är avstängt. Den returnerar Boolean
.
const incomingAudioMuted = call.isIncomingAudioMuted;
Kontrollera om videon är på. Den returnerar Boolean
.
const isLocalVideoStarted = call.isLocalVideoStarted;
Kontrollera att skärmdelning är aktiverat. Den returnerar Boolean
.
const isScreenSharingOn = call.isScreenSharingOn;
Installera SDK:n
Leta upp filen på projektnivå build.gradle
och lägg till mavenCentral()
i listan med lagringsplatser under buildscript
och allprojects
:
buildscript {
repositories {
...
mavenCentral()
...
}
}
allprojects {
repositories {
...
mavenCentral()
...
}
}
Lägg sedan till följande rader i modulnivåfilen build.gradle
i dependencies
avsnittet:
dependencies {
...
implementation 'com.azure.android:azure-communication-calling:1.0.0'
...
}
Initiera nödvändiga objekt
Om du vill skapa en CallAgent
instans måste du anropa createCallAgent
metoden på en CallClient
instans. Det här anropet returnerar asynkront ett CallAgent
instansobjekt.
Metoden createCallAgent
tar CommunicationUserCredential
som ett argument som kapslar in en åtkomsttoken.
Om du vill komma åt DeviceManager
måste du skapa en callAgent
instans först. Sedan kan du använda CallClient.getDeviceManager
metoden för att hämta 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();
Om du vill ange ett visningsnamn för anroparen använder du den här alternativa metoden:
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();
Ringa ett samtal
För att skapa och starta ett anrop måste du anropa CallAgent.startCall()
metoden och ange Identifier
för de anropade.
Om du vill ansluta till ett gruppsamtal måste du anropa CallAgent.join()
metoden och ange groupId. Grupp-ID:t måste vara i GUID- eller UUID-format.
Skapande och start av samtal är synkrona. Med samtalsinstansen kan du prenumerera på alla händelser i samtalet.
Placera ett 1:1-anrop till en användare
Om du vill ringa ett anrop till en annan Communication Services-användare anropar call
du metoden på callAgent
och skickar ett objekt med communicationUserId
nyckeln.
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);
Placera ett 1:n-samtal med användare och PSTN
Kommentar
Kontrollera information om PSTN-samtalserbjudandet. För förhandsversion av programåtkomst gäller du för det tidiga adopterprogrammet.
Om du vill ringa ett 1:n-samtal till en användare och ett PSTN-nummer måste du ange telefonnummer för den som ringer. Din Communication Services-resurs måste konfigureras för att tillåta PSTN-samtal:
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);
Ta emot samtal
Om du vill acceptera ett anrop anropar du metoden "acceptera" för ett anropsobjekt.
Context appContext = this.getApplicationContext();
IncomingCall incomingCall = retrieveIncomingCall();
Call call = incomingCall.accept(context).get();
Så här accepterar du ett samtal med videokameran på:
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();
Det inkommande samtalet kan hämtas genom att onIncomingCall
prenumerera på händelsen på callAgent
objektet:
// 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;
}
Ansluta till ett rumssamtal
CallAgent
Använd och RoomCallLocator
för att ansluta ett rumsanrop genom att ange en roomId
. Metoden CallAgent.join
returnerar ett Call
objekt:
val roomCallLocator = RoomCallLocator(roomId)
call = callAgent.join(applicationContext, roomCallLocator, joinCallOptions)
En room
ger programutvecklare bättre kontroll över vem som kan ansluta till ett samtal, när de träffas och hur de samarbetar. Om du vill veta mer om rooms
kan du läsa den konceptuella dokumentationen eller följa snabbstartsguiden.
Ansluta till ett gruppsamtal
Om du vill starta ett nytt gruppanrop eller ansluta till ett pågående gruppsamtal måste du anropa metoden "join" och skicka ett objekt med en groupId
egenskap. Värdet måste vara ett GUID.
Context appContext = this.getApplicationContext();
GroupCallLocator groupCallLocator = new GroupCallLocator("<GUID>");
JoinCallOptions joinCallOptions = new JoinCallOptions();
call = callAgent.join(context, groupCallLocator, joinCallOptions);
Samtalsegenskaper
Hämta det unika ID:t för det här samtalet:
String callId = call.getId();
Om du vill veta mer om andra deltagare i anropet inspekterar remoteParticipant
du samlingen på instansen call
:
List<RemoteParticipant> remoteParticipants = call.getRemoteParticipants();
Identiteten för anroparen om samtalet är inkommande:
CommunicationIdentifier callerId = call.getCallerInfo().getIdentifier();
Hämta tillståndet för samtalet:
CallState callState = call.getState();
Den returnerar en sträng som representerar det aktuella tillståndet för ett anrop:
- "NONE" – inledande anropstillstånd
- "EARLY_MEDIA" – anger ett tillstånd där ett meddelande spelas upp innan samtalet ansluts
- "CONNECTING" – inledande övergångstillstånd när anropet har gjorts eller godkänts
- "RINGING" - för ett utgående samtal - indikerar att samtalet ringer för fjärrdeltagare
- "ANSLUTEN" – samtalet är anslutet
- "LOCAL_HOLD" – samtalet spärras av den lokala deltagaren, inget media flödar mellan den lokala slutpunkten och fjärrdeltagare
- "REMOTE_HOLD" – samtalet spärras av en fjärrdeltagare, inga medier flödar mellan den lokala slutpunkten och fjärrdeltagare
- "KOPPLA FRÅN" – övergångstillstånd innan anropet går till tillståndet "Frånkopplad"
- "FRÅNKOPPLAD" – slutligt anropstillstånd
- "IN_LOBBY" – i lobbyn för ett Teams-mötessamverkans
Om du vill veta varför ett samtal avslutades kontrollerar du callEndReason
egenskapen. Den innehåller kod/underkod:
CallEndReason callEndReason = call.getCallEndReason();
int code = callEndReason.getCode();
int subCode = callEndReason.getSubCode();
Om du vill se om det aktuella samtalet är ett inkommande eller utgående samtal kontrollerar du callDirection
egenskapen:
CallDirection callDirection = call.getCallDirection();
// callDirection == CallDirection.INCOMING for incoming call
// callDirection == CallDirection.OUTGOING for outgoing call
Om du vill se om den aktuella mikrofonen är avstängd kontrollerar du egenskapen muted
:
boolean muted = call.isMuted();
Om du vill granska aktiva videoströmmar kontrollerar du localVideoStreams
samlingen:
List<LocalVideoStream> localVideoStreams = call.getLocalVideoStreams();
Slå av och på ljud
Om du vill stänga av eller slå på ljudet för den lokala slutpunkten kan du använda de mute
asynkrona API:erna:unmute
Context appContext = this.getApplicationContext();
call.mute(appContext).get();
call.unmute(appContext).get();
Ändra volymen för anropet
När du är i ett samtal bör maskinvaruvolymnycklarna på telefonen göra det möjligt för användaren att ändra samtalsvolymen.
Detta görs med hjälp av metoden setVolumeControlStream
med strömtypen AudioManager.STREAM_VOICE_CALL
på aktiviteten där anropet görs.
Detta gör att maskinvaruvolymnycklarna kan ändra volymen för samtalet (som anges av en telefonikon eller något liknande på volymreglaget), vilket förhindrar att volymen ändras för andra ljudprofiler, till exempel larm, media eller systemomfattande volym. Mer information finns i Hantera ändringar i ljudutdata | Android-utvecklare.
@Override
protected void onCreate(Bundle savedInstanceState) {
...
setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
}
Hantering av fjärrdeltagare
Alla fjärrdeltagare representeras av RemoteParticipant
typen och är tillgängliga via remoteParticipants
samlingen på en samtalsinstans.
Visa en lista över deltagare i ett samtal
Samlingen remoteParticipants
returnerar en lista över fjärranslutna deltagare i ett visst anrop:
List<RemoteParticipant> remoteParticipants = call.getRemoteParticipants(); // [remoteParticipant, remoteParticipant....]
Lägga till en deltagare i ett anrop
Om du vill lägga till en deltagare i ett samtal (antingen en användare eller ett telefonnummer) kan du anropa addParticipant
.
Detta returnerar synkront fjärrdeltagareinstansen.
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);
Ta bort deltagare från ett anrop
Om du vill ta bort en deltagare från ett samtal (antingen en användare eller ett telefonnummer) kan du anropa removeParticipant
.
Detta löser asynkront när deltagaren har tagits bort från anropet.
Deltagaren tas också bort från remoteParticipants
samlingen.
RemoteParticipant acsUserRemoteParticipant = call.getParticipants().get(0);
RemoteParticipant acsPhoneRemoteParticipant = call.getParticipants().get(1);
call.removeParticipant(acsUserRemoteParticipant).get();
call.removeParticipant(acsPhoneRemoteParticipant).get();
Egenskaper för fjärrdeltagare
En viss fjärrdeltagare har en uppsättning egenskaper och samlingar som är associerade med den:
Hämta identifieraren för den här fjärrdeltagaren. Identitet är en av typerna "Identifierare"
CommunicationIdentifier participantIdentifier = remoteParticipant.getIdentifier();
Hämta tillstånd för den här fjärrdeltagaren.
ParticipantState state = remoteParticipant.getState();
Tillståndet kan vara ett av
"INAKTIV" – inledande tillstånd
"EARLY_MEDIA" – meddelandet spelas upp innan deltagaren är ansluten till samtalet
"RINGNING" – deltagarsamtalet ringer
"ANSLUTA" – övergångstillstånd när deltagaren ansluter till anropet
"ANSLUTEN" – deltagaren är ansluten till anropet
"HOLD" – deltagaren är pausad
"IN_LOBBY" - deltagare väntar i lobbyn för att släppas in. Används för närvarande endast i Teams interop-scenario
"DISCONNECTED" – slutligt tillstånd – deltagaren är frånkopplad från anropet
Om du vill veta varför en deltagare lämnade samtalet kontrollerar du
callEndReason
egenskapen:CallEndReason callEndReason = remoteParticipant.getCallEndReason();
Om du vill kontrollera om den här fjärrdeltagaren är avstängd eller inte kontrollerar du egenskapen
isMuted
:boolean isParticipantMuted = remoteParticipant.isMuted();
Om du vill kontrollera om den här fjärrdeltagaren talar eller inte kontrollerar du egenskapen
isSpeaking
:boolean isParticipantSpeaking = remoteParticipant.isSpeaking();
Om du vill kontrollera alla videoströmmar som en viss deltagare skickar i det här anropet
videoStreams
kontrollerar du samlingen:List<RemoteVideoStream> videoStreams = remoteParticipant.getVideoStreams(); // [RemoteVideoStream, RemoteVideoStream, ...]
Stäng av ljudet för andra deltagare
Kommentar
Om du vill använda det här API:et använder du Azure Communication Services Calling Android SDK version 2.11.0 eller senare.
Om du vill stänga av ljudet för alla andra deltagare i ett anrop använder du API:et muteAllRemoteParticipants
för anropet.
call.muteAllRemoteParticipants();
Om du vill stänga av en specifik fjärrdeltagare använder du API:et mute
på en viss fjärrdeltagare.
remoteParticipant.mute();
Om du vill meddela den lokala deltagaren att de har stängts av av andra prenumererar du på onMutedByOthers
händelsen.
Använda förgrundstjänster
Om du vill köra en användar synlig uppgift även när programmet är i bakgrunden kan du använda Foreground Services.
Med foreground Services kan du till exempel hålla en användare synlig när programmet har ett aktivt anrop. På så sätt fortsätter anropet att vara aktivt även om användaren går till startskärmen eller tar bort programmet från den senaste skärmen.
Om du inte använder en förgrundstjänst när du är i ett anrop kan du gå till startskärmen för att hålla samtalet aktivt, men om du tar bort programmet från den senaste skärmen kan du stoppa samtalet om Android-operativsystemet avbryter programmets process.
Du bör starta förgrundstjänsten när du startar/ansluter ett anrop, till exempel:
call = callAgent.startCall(context, participants, options);
startService(yourForegroundServiceIntent);
Och stoppa förgrundstjänsten när du lägger på anropet eller samtalets status är Frånkopplad, till exempel:
call.hangUp(new HangUpOptions()).get();
stopService(yourForegroundServiceIntent);
Information om hur du använder Foreground Services
Tänk på att scenarier som att stoppa en förgrundstjänst som redan körs när appen tas bort från den senaste listan tar bort användarens synliga meddelande och Android-operativsystemet kan hålla programprocessen vid liv under en extra tidsperiod, vilket innebär att anropet fortfarande kan vara aktivt under den här perioden.
Om programmet till exempel stoppar förgrundstjänsten på tjänstmetoden onTaskRemoved
kan programmet starta/stoppa ljud och video enligt aktivitetslivscykeln, till exempel stoppa ljud och video när aktiviteten förstörs med onDestroy
metodens åsidosättning.
Konfigurera systemet
Följ de här stegen för att konfigurera systemet.
Skapa Xcode-projektet
I Xcode skapar du ett nytt iOS-projekt och väljer mallen Enkel vyapp . Den här artikeln använder SwiftUI-ramverket, så du bör ange Language till Swift och ange Gränssnitt till SwiftUI.
Du kommer inte att skapa tester i den här artikeln. Avmarkera kryssrutan Inkludera tester .
Installera paketet och beroenden med hjälp av CocoaPods
Skapa en Podfile för ditt program, som i det här exemplet:
platform :ios, '13.0' use_frameworks! target 'AzureCommunicationCallingSample' do pod 'AzureCommunicationCalling', '~> 1.0.0' end
Kör
pod install
.Öppna
.xcworkspace
med Xcode.
Begär åtkomst till mikrofonen
För att få åtkomst till enhetens mikrofon måste du uppdatera appens egenskapslista för information med hjälp NSMicrophoneUsageDescription
av . Ange det associerade värdet till en sträng som ingår i dialogrutan som systemet använder för att begära åtkomst från användaren.
Högerklicka på posten Info.plist i projektträdet och välj sedan Öppna som>källkod. Lägg till följande rader i avsnittet på den översta nivån <dict>
och spara sedan filen.
<key>NSMicrophoneUsageDescription</key>
<string>Need microphone access for VOIP calling.</string>
Konfigurera appramverket
Öppna projektets ContentView.swift
fil. Lägg till en import
deklaration överst i filen för att importera AzureCommunicationCalling
biblioteket. Importera dessutom AVFoundation
. Du behöver den för begäranden om ljudbehörighet i koden.
import AzureCommunicationCalling
import AVFoundation
Initiera CallAgent
Om du vill skapa en CallAgent
instans från CallClient
måste du använda en callClient.createCallAgent
metod som asynkront returnerar ett CallAgent
objekt när det har initierats.
Skicka ett CommunicationTokenCredential
objekt för att skapa en anropsklient:
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)
}
Skicka objektet CommunicationTokenCredential
som du skapade till CallClient
och ange visningsnamnet:
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")
}
})
Kommentar
När programmet implementerar händelsedelegater måste det innehålla en stark referens till de objekt som kräver händelseprenumerationer. När ett RemoteParticipant
objekt till exempel returneras när metoden anropas call.addParticipant
och programmet anger ombudet att lyssna på RemoteParticipantDelegate
måste programmet ha en stark referens till RemoteParticipant
objektet. Om det här objektet annars samlas in utlöser ombudet ett allvarligt undantag när anropande SDK försöker anropa objektet.
Ringa ett utgående samtal
För att skapa och starta ett anrop måste du anropa ett av API:erna på CallAgent
och ange kommunikationstjänsternas identitet för en användare som du har etablerat med hjälp av Communication Services Management SDK.
Skapande och start av samtal är synkrona. Du får en samtalsinstans som gör att du kan prenumerera på alla händelser i samtalet.
Ringa ett 1:1-samtal till en användare eller ett 1:n-samtal med användare och 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")
}
}
Placera ett 1:n-samtal med användare och PSTN
Kommentar
Kontrollera information om PSTN-samtalserbjudandet. För förhandsversion av programåtkomst gäller du för det tidiga adopterprogrammet.
Om du vill ringa till PSTN måste du ange ett telefonnummer som hämtats med 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")
}
}
Ansluta till ett rumssamtal
Om du vill ansluta ett room
anrop anger du roomId
egenskapen som identifierare room
. Om du vill ansluta anropet använder du join
metoden och skickar 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)
}
}
En room
ger programutvecklare bättre kontroll över vem som kan ansluta till ett samtal, när de träffas och hur de samarbetar. Om du vill veta mer om rooms
kan du läsa den konceptuella dokumentationen eller följa snabbstartsguiden.
Ansluta till ett gruppsamtal
Om du vill ansluta till ett anrop måste du anropa ett av API:erna på 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")
}
}
Prenumerera på ett inkommande samtal
Prenumerera på en inkommande samtalshändelse.
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
}
}
Acceptera ett inkommande samtal
Om du vill acceptera ett anrop anropar du metoden för accept
ett IncomingCall
objekt.
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")
}
Utföra åtgärder mitt i anropet
Du kan utföra olika åtgärder under ett anrop för att hantera inställningar som rör video och ljud.
Slå av och på ljud
Om du vill stänga av eller slå på den lokala slutpunkten kan du använda de mute
asynkrona API:erna och unmute
.
call!.mute { (error) in
if error == nil {
print("Successfully muted")
} else {
print("Failed to mute")
}
}
Använd följande kod för att slå på ljudet för den lokala slutpunkten asynkront.
call!.unmute { (error) in
if error == nil {
print("Successfully un-muted")
} else {
print("Failed to unmute")
}
}
Hantera fjärrdeltagare
Alla fjärrdeltagare representeras av typen RemoteParticipant
och är tillgängliga via remoteParticipants
samlingen på en samtalsinstans.
Visa en lista över deltagare i ett samtal
call.remoteParticipants
Lägga till en deltagare i ett anrop
Om du vill lägga till en deltagare i ett samtal (antingen en användare eller ett telefonnummer) kan du anropa addParticipant
. Det här kommandot returnerar synkront en fjärrdeltagareinstans.
let remoteParticipantAdded: RemoteParticipant = call.add(participant: CommunicationUserIdentifier(identifier: "userId"))
Ta bort en deltagare från ett anrop
Om du vill ta bort en deltagare från ett samtal (antingen en användare eller ett telefonnummer) kan du anropa API:et removeParticipant
. Detta löser asynkront.
call!.remove(participant: remoteParticipantAdded) { (error) in
if (error == nil) {
print("Successfully removed participant")
} else {
print("Failed to remove participant")
}
}
Hämta egenskaper för fjärrdeltagare
// [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, ...]
Stäng av ljudet för andra deltagare
Kommentar
Om du vill använda det här API:et använder du Azure Communication Services Calling iOS SDK version 2.13.0 eller senare.
Om du vill stänga av ljudet för alla andra deltagare i ett anrop använder du API:et muteAllRemoteParticipants
för anropet.
call!.muteAllRemoteParticipants { (error) in
if error == nil {
print("Successfully muted all remote participants.")
} else {
print("Failed to mute remote participants.")
}
}
Om du vill stänga av en specifik fjärrdeltagare använder du API:et mute
på en viss fjärrdeltagare.
remoteParticipant.mute { (error) in
if error == nil {
print("Successfully muted participant.")
} else {
print("Failed to mute participant.")
}
}
Om du vill meddela den lokala deltagaren att de har stängts av av andra prenumererar du på onMutedByOthers
händelsen.
Konfigurera systemet
Följ de här stegen för att konfigurera systemet.
Skapa Visual Studio-projektet
För en Universell Windows-plattform app skapar du i Visual Studio 2022 ett nytt projekt för Tom app (Universell Windows). När du har angett projektnamnet kan du välja valfri Windows SDK senare än 10.0.17763.0.
För en WinUI 3-app skapar du ett nytt projekt med mallen Tom app, Paketerad (WinUI 3 i Desktop) för att konfigurera en WinUI 3-app med en enda sida. SDK för Windows-appar version 1.3 eller senare krävs.
Installera paketet och beroendena med hjälp av NuGet Package Manager
Anropande SDK-API:er och bibliotek är offentligt tillgängliga via ett NuGet-paket.
Så här hittar du, laddar ned och installerar det anropande SDK NuGet-paketet:
- Öppna NuGet Package Manager genom att välja Verktyg>NuGet Package Manager>Hantera NuGet-paket för lösning.
- Välj Bläddra och ange sedan Azure.Communication.Calling.WindowsClient i sökrutan.
- Kontrollera att kryssrutan Inkludera förhandsversion är markerad.
- Välj paketet Azure.Communication.Calling.WindowsClient och välj sedan Azure.Communication.Calling.WindowsClient 1.4.0-beta.1 eller en nyare version.
- Markera kryssrutan som motsvarar Azure Communication Services-projektet i den högra rutan.
- Välj Installera.
Begär åtkomst till mikrofonen
Appen kräver åtkomst till mikrofonen för att kunna köras korrekt. I UWP-appar ska mikrofonfunktionen deklareras i appens manifestfil.
Följande steg illustrerar hur du kan uppnå detta.
- Dubbelklicka på filen med
.appxmanifest
filnamnstilläggetSolution Explorer
i panelen. - Klicka på fliken
Capabilities
. - Markera kryssrutan
Microphone
i listan över funktioner.
Skapa användargränssnittsknappar för att placera och lägga på anropet
Den här enkla exempelappen innehåller två knappar. En för att ringa samtalet och en annan för att hänga upp ett uppringt samtal. Följande steg illustrerar hur du lägger till dessa knappar i appen.
Solution Explorer
Dubbelklicka på filen med namnetMainPage.xaml
UWP i panelen ellerMainWindows.xaml
för WinUI 3.- I den centrala panelen letar du efter XAML-koden under förhandsversionen av användargränssnittet.
- Ändra XAML-koden med följande utdrag:
<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>
Konfigurera appen med anropande SDK-API:er
Api:erna för anropande SDK finns i två olika namnområden. Följande steg informerar C#-kompilatorn om dessa namnområden så att Visual Studio Intellisense kan hjälpa till med kodutveckling.
- I panelen
Solution Explorer
klickar du på pilen till vänster i filen med namnetMainPage.xaml
UWP ellerMainWindows.xaml
för WinUI 3. - Dubbelklicka på filen med namnet
MainPage.xaml.cs
ellerMainWindows.xaml.cs
. - Lägg till följande kommandon längst ned i de aktuella
using
instruktionerna.
using Azure.Communication.Calling.WindowsClient;
Behåll MainPage.xaml.cs
eller MainWindows.xaml.cs
öppna. Nästa steg lägger till mer kod i den.
Tillåt appinteraktioner
Användargränssnittsknapparna som tidigare lagts till måste fungera ovanpå en placerad CommunicationCall
. Det innebär att en CommunicationCall
datamedlem ska läggas till i MainPage
klassen eller MainWindow
.
För att den asynkrona åtgärden som skapas CallAgent
ska lyckas bör en CallAgent
datamedlem dessutom läggas till i samma klass.
Lägg till följande datamedlemmar i MainPage
pr-klassen MainWindow
:
CallAgent callAgent;
CommunicationCall call;
Skapa knapphanterare
Tidigare lades två användargränssnittsknappar till i XAML-koden. Följande kod lägger till de hanterare som ska köras när en användare väljer knappen. Följande kod ska läggas till efter datamedlemmarna från föregående avsnitt.
private async void CallButton_Click(object sender, RoutedEventArgs e)
{
// Start call
}
private async void HangupButton_Click(object sender, RoutedEventArgs e)
{
// End the current call
}
Objektmodell
Följande klasser och gränssnitt hanterar några av de viktigaste funktionerna i Azure Communication Services Calling-klientbiblioteket för UWP.
Name | beskrivning |
---|---|
CallClient |
CallClient är huvudinmatningspunkten till klientbiblioteket För samtal. |
CallAgent |
CallAgent Används för att starta och ansluta anrop. |
CommunicationCall |
CommunicationCall Används för att hantera placerade eller anslutna anrop. |
CommunicationTokenCredential |
CommunicationTokenCredential Används som tokenautentiseringsuppgifter för att instansiera CallAgent . |
CallAgentOptions |
CallAgentOptions Innehåller information för att identifiera anroparen. |
HangupOptions |
Informerar HangupOptions om ett samtal ska avslutas till alla dess deltagare. |
Initiera CallAgent
Om du vill skapa en CallAgent
instans från CallClient
måste du använda CallClient.CreateCallAgentAsync
en metod som asynkront returnerar ett CallAgent
objekt när det har initierats.
Om du vill skapa CallAgent
måste du skicka ett CallTokenCredential
objekt och ett CallAgentOptions
objekt. Tänk på att CallTokenCredential
genererar om en felaktig token skickas.
Följande kod bör läggas till i och hjälpfunktionen som ska anropas i appinitiering.
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);
Ändra med en giltig token för autentiseringsuppgifter för resursen <AUTHENTICATION_TOKEN>
. Se dokumentationen för användaråtkomsttoken om en token för autentiseringsuppgifter måste hämtas.
Skapa CallAgent och placera ett anrop
De objekt som behövs för att skapa en CallAgent
är nu klara. Det är dags att asynkront skapa CallAgent
och placera ett anrop.
Följande kod bör läggas till efter hanteringen av undantaget från föregående steg.
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;
Använd gärna 8:echo123
för att prata med Azure Communication Services-ekoroboten.
Slå av och på ljud
Om du vill stänga av eller inaktivera utgående ljud kan du använda de MuteOutgoingAudioAsync
asynkrona API:erna:UnmuteOutgoingAudioAsync
// mute outgoing audio
await this.call.MuteOutgoingAudioAsync();
// unmute outgoing audio
await this.call.UnmuteOutgoingAudioAsync();
Stäng av ljudet för andra deltagare
Kommentar
Om du vill använda det här API:et använder du Azure Communication Services Calling Windows SDK version 1.9.0 eller senare.
Om du vill stänga av ljudet för alla andra deltagare eller stänga av ljudet för en specifik deltagare kan du använda asynkrona API:er MuteAllRemoteParticipantsAsync
för anropet och MuteAsync
på fjärrdeltagaren:
// mute all participants except yourself
await this.call.MuteAllRemoteParticipantsAsync();
// mute specific participant in the call
await this.call.RemoteParticipants.FirstOrDefault().MuteAsync();
Om du vill meddela den lokala deltagaren att de har stängts av av andra prenumererar du på MutedByOthers
händelsen.
Avsluta samtal
När ett anrop har placerats HangupAsync
ska -metoden CommunicationCall
för objektet användas för att lägga på anropet.
En instans av HangupOptions
bör också användas för att informera om samtalet måste avslutas till alla deltagare.
Följande kod bör läggas till i HangupButton_Click
.
this.call.OnStateChanged -= Call_OnStateChangedAsync;
await this.call.HangUpAsync(new HangUpOptions() { ForEveryone = false });
Kör koden
Se till att Visual Studio skapar appen för , x86
eller ARM64
och tryck F5
sedan på för x64
att börja köra appen. Därefter klickar du på Call
knappen för att ringa ett anrop till den definierade anropare.
Tänk på att första gången appen körs uppmanar systemet användaren att bevilja åtkomst till mikrofonen.