Aramaları yönetme
Azure İletişim Hizmetleri SDKS ile çağrıları yönetmeyi öğrenin. Arama yapmayı, katılımcılarını ve özelliklerini yönetmeyi öğreneceğiz.
Önkoşullar
- Etkin aboneliği olan bir Azure hesabı. Ücretsiz hesap oluşturun.
- Dağıtılan bir İletişim Hizmetleri kaynağı. İletişim Hizmetleri kaynağı oluşturun.
- Çağrı istemcisini etkinleştirmek için A
User Access Token
. Alma hakkında daha fazla bilgi içinUser Access Token
- İsteğe bağlı: Uygulamanıza çağrı eklemeye başlamak için hızlı başlangıcı tamamlayın
SDK’yı yükleyin
npm install
JavaScript için Azure İletişim Hizmetleri Common ve Calling SDK'sını yüklemek için komutunu kullanın:
npm install @azure/communication-common --save
npm install @azure/communication-calling --save
Gerekli nesneleri başlatma
CallClient
Çoğu çağrı işlemi için bir örnek gereklidir. Yeni CallClient
bir örnek oluşturduğunuzda, örneği gibi Logger
özel seçeneklerle yapılandırabilirsiniz.
örneğiyleCallClient
, çağrısı createCallAgent
yaparak bir CallAgent
örnek oluşturabilirsiniz. Bu yöntem zaman uyumsuz olarak bir CallAgent
örnek nesnesi döndürür.
createCallAgent
yöntemi bağımsız değişken olarak kullanırCommunicationTokenCredential
. Kullanıcı erişim belirtecini kabul eder.
öğesine erişmek deviceManager
için örnekteki CallClient
yöntemini kullanabilirsinizgetDeviceManager
.
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()
Microsoft altyapısına SDK bağlantısını en iyi şekilde yönetme
Örnek, Call Agent
çağrıları yönetmenize yardımcı olur (aramalara katılmak veya çağrıları başlatmak için). Arama SDK'nızın çalışması için gelen aramaların bildirimlerini almak ve diğer arama ayrıntılarını koordine etmek için Microsoft altyapısına bağlanması gerekir. Sizin iki olası durumu vardır Call Agent
:
Bağlı - Call Agent
connectionStatue değeri Connected
, istemci SDK'sının bağlı olduğu ve Microsoft altyapısından bildirim alabilen olduğu anlamına gelir.
Bağlantısı kesildi - Call Agent
Durumların Disconnected
connectionStatue değeri, SDK'nın düzgün bağlanmasını engelleyen bir sorun var. Call Agent
yeniden oluşturulmalıdır.
invalidToken
: Belirtecin süresi dolduysa veya geçersizCall Agent
örnekse bu hatayla bağlantı kesilir.connectionIssue
: İstemcinin Microsoft infrascture'a bağlanmasıyla ilgili bir sorun varsa, birçok yeniden denemedenCall Agent
sonra hata ortayaconnectionIssue
çıkar.
Özelliğin geçerli değerini connectionState
inceleyerek yerel Call Agent
bilgisayarınızın Microsoft altyapısına bağlı olup olmadığını denetleyebilirsiniz. Etkin bir çağrı sırasında, Bağlı durumundan connectionStateChanged
Bağlantısız duruma gelen değişikliklerin olup olmadığını Call Agent
belirlemek için olayı dinleyebilirsiniz.
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);
Arama yerleştirme
Arama oluşturmak ve başlatmak için üzerindeki callAgent
API'lerden birini kullanın ve İletişim Hizmetleri kimlik SDK'sı aracılığıyla oluşturduğunuz bir kullanıcıya sağlayın.
Çağrı oluşturma ve başlatma zaman uyumlu. Örnek, call
çağrı olaylarına abone olmanıza olanak tanır.
Kullanıcıya veya PSTN'ye 1:n çağrısı yerleştirme
Başka bir İletişim Hizmetleri kullanıcısını startCall
çağırmak için yöntemini callAgent
kullanın ve oluşturduğunuz alıcıları CommunicationUserIdentifier
İletişim Hizmetleri yönetim kitaplığıyla geçirin.
Kullanıcıya "1:1" çağrısı için aşağıdaki kodu kullanın:
const userCallee = { communicationUserId: '<ACS_USER_ID>' }
const oneToOneCall = callAgent.startCall([userCallee]);
Genel anahtarlı telefon ağına (PSTN) çağrı yapmak için yöntemini callAgent
kullanın startCall
ve alıcının PhoneNumberIdentifier
öğesini geçirin. İletişim Hizmetleri kaynağınız PSTN çağrısına izin verecek şekilde yapılandırılmalıdır.
PSTN numarasını ararken alternatif arayan kimliğinizi belirtin. Alternatif arayan kimliği, PSTN aramasında arayanı tanımlayan bir telefon numarasıdır (E.164 standardına göre). Bu, gelen arama için arama alıcısının gördüğü telefon numarasıdır.
Not
LÜTFEN PSTN arama teklifinin ayrıntılarını denetleyin. Önizleme programı erişimi için erken benimseyen programa başvurun.
PSTN numarasına 1:1 çağrısı için aşağıdaki kodu kullanın:
const pstnCallee = { phoneNumber: '<ACS_USER_ID>' }
const alternateCallerId = {phoneNumber: '<ALTERNATE_CALLER_ID>'};
const oneToOneCall = callAgent.startCall([pstnCallee], { alternateCallerId });
Bir kullanıcıya 1:n çağrısı ve PSTN numarası için aşağıdaki kodu kullanın:
const userCallee = { communicationUserId: '<ACS_USER_ID>' }
const pstnCallee = { phoneNumber: '<PHONE_NUMBER>'};
const alternateCallerId = {phoneNumber: '<ALTERNATE_CALLER_ID>'};
const groupCall = callAgent.startCall([userCallee, pstnCallee], { alternateCallerId });
Oda aramasını katılma
Bir çağrıya katılmak room
için, tanımlayıcı olarak room
özelliğiyle roomId
bir bağlam nesnesi örneği oluşturabilirsiniz. Çağrısına katılmak için yöntemini kullanın join
ve bağlam örneğini geçirin.
const context = { roomId: '<RoomId>' }
const call = callAgent.join(context);
Uygulama room
geliştiricilerine bir aramaya kimlerin katılabileceği, ne zaman toplantı yapabilecekleri ve nasıl işbirliği yapabilecekleri üzerinde daha iyi denetim olanağı sunar. hakkında rooms
daha fazla bilgi edinmek için kavramsal belgeleri okuyabilir veya hızlı başlangıç kılavuzunu izleyebilirsiniz.
Grup çağrısına katılma
Not
groupId
parametresi sistem meta verileri olarak kabul edilir ve Microsoft tarafından sistemi çalıştırmak için gereken işlemler için kullanılabilir. Değere kişisel verileri eklemeyin groupId
. Microsoft bu parametreyi kişisel veriler olarak algılamaz ve içeriği Microsoft çalışanları tarafından görülebilir veya uzun süreli depolanabilir.
groupId
parametresi, verilerin GUID biçiminde olmasını gerektirir. Sistemlerinizde kişisel veriler olarak kabul edilmeden rastgele oluşturulmuş GUID'ler kullanmanızı öneririz.
Yeni bir grup çağrısı başlatmak veya devam eden bir grup çağrısına join
katılmak için yöntemini kullanın ve özelliği olan bir groupId
nesne geçirin. Değerin groupId
GUID olması gerekir.
const context = { groupId: '<GUID>'};
const call = callAgent.join(context);
Gelen arama alma
Örnek, callAgent
oturum açan kimlik gelen bir incomingCall
çağrı aldığında bir olay yayar. Bu olayı dinlemek için şu seçeneklerden birini kullanarak abone olun:
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);
Olay, incomingCall
kabul ettiğiniz veya reddedebileceğiniz bir incomingCall
örnek içerir.
Azure İletişim Çağrısı SDK'sı bir kamera başlatırStartFailed: Kamera başlatılırken, kabul edilirken veya görüntülü aramaya katılırken kullanılabilir değilse gerçek arama tanılaması. Bu durumda, arama video kapalı olarak başlar. Kamera başka bir işlem tarafından kullanıldığından veya işletim sisteminde devre dışı bırakıldığından kullanılamayabilir.
Aramayı bekletme ve sürdürme
Not
Belirli bir anda yalnızca 1 etkin çağrı olmalıdır ( Connected
durumda, etkin medya ile). Diğer tüm çağrılar bir kullanıcı tarafından beklemeye alınmalıdır veya uygulama tarafından programlı olarak yapılmalıdır. Bu durum, kullanıcının birden çok giden ve gelen aramayı işlemesi gerekebileceği, tüm etkin olmayan çağrıların beklemeye alınması ve kullanıcının yalnızca etkin aramada başkalarıyla etkileşim kurması gereken kişi merkezleri gibi senaryolarda yaygındır
Aramayı tutmak veya sürdürmek için ve resume
zaman uyumsuz API'lerini kullanabilirsinizhold
:
Aramayı tutmak için
await call.hold();
API çözümlendiğinde hold
çağrı durumu olarak LocalHold
ayarlanır. 1:1 çağrısında diğer katılımcı da beklemeye alınıp bu katılımcının perspektifinden çağrının durumu 'RemoteHold' olarak ayarlanır. Daha sonra, diğer katılımcı çağrısını beklemeye alabilir ve bu da durumunda değişiklik yapılmasına LocalHold
neden olur.
Bir grup aramasında veya toplantıda - hold
yerel bir işlemdir, diğer arama katılımcıları için aramayı tutmaz.
Aramayı sürdürmek için bekletmeyi başlatan tüm kullanıcıların aramayı sürdürmesi gerekir.
Aramayı beklemeden sürdürmek için:
await call.resume();
resume
API çözümlendiğinde, çağrı durumu yeniden olarak Connected
ayarlanır.
Aramanın sesini kapatma ve açma
Yerel uç noktanın sesini kapatmak veya açmak için ve unmute
zaman uyumsuz API'lerini kullanabilirsinizmute
:
//mute local device (microphone / sent audio)
await call.mute();
//unmute local device (microphone / sent audio)
await call.unmute();
Gelen sesi kapatma ve açma
Gelen sesi kapat seçeneği arama ses düzeyini 0 olarak ayarlar. Gelen sesin sesini kapatmak veya açmak için ve unmuteIncomingAudio
zaman uyumsuz API'lerini kullanabilirsinizmuteIncomingAudio
:
//mute local device (speaker)
await call.muteIncomingAudio();
//unmute local device (speaker)
await call.unmuteIncomingAudio();
Gelen ses kapatıldığında, katılımcı istemci SDK'sı arama sesini (uzak katılımcının sesi) almaya devam eder. Arama sesi hoparlörde duyulmaz ve katılımcı 'call.unmuteIncomingAudio()' çağrılana kadar dinleme yapamaz. Ancak arama sesine filtre uygulayabilir ve filtrelenmiş sesi çalabiliriz.
Uzak katılımcıları yönetme
Tüm uzak katılımcılar nesnede RemoteParticipant
ayrıntılı olarak gösterilir ve bir çağrı örneğindeki remoteParticipants
koleksiyon aracılığıyla kullanılabilir. remoteParticipants
öğesine bir Call
örnekten erişilebilir.
Aramadaki katılımcıları listeleme
Koleksiyon, remoteParticipants
bir çağrıdaki uzak katılımcıların listesini döndürür:
call.remoteParticipants; // [remoteParticipant, remoteParticipant....]
Aramaya katılımcı ekleme
Bir aramaya katılımcı (kullanıcı veya telefon numarası) eklemek için API'yi addParticipant
kullanabilirsiniz. Türlerden Identifier
birini sağlayın. Zaman uyumlu olarak örneği döndürür remoteParticipant
. remoteParticipantsUpdated
Çağrıdaki olay, bir katılımcı çağrıya başarıyla eklendiğinde oluşturulur.
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 });
Bir katılımcıyı aramadan kaldırma
Bir katılımcıyı (kullanıcı veya telefon numarası) aramadan kaldırmak için öğesini çağırabilirsiniz removeParticipant
. Türlerden Identifier
birini geçirmeniz gerekir. Bu yöntem, katılımcı çağrıdan kaldırıldıktan sonra zaman uyumsuz olarak çözümleniyor. Katılımcı da koleksiyondan remoteParticipants
kaldırılır.
const userIdentifier = { communicationUserId: '<ACS_USER_ID>' };
const pstnIdentifier = { phoneNumber: '<PHONE_NUMBER>' }
await call.removeParticipant(userIdentifier);
await call.removeParticipant(pstnIdentifier);
Uzak katılımcı özelliklerine erişme
Uzak katılımcıların bir dizi ilişkili özelliği ve koleksiyonu vardır:
CommunicationIdentifier
: Uzak katılımcının tanımlayıcısını alın. Kimlik, aşağıdakiCommunicationIdentifier
türlerden biridir:
const identifier = remoteParticipant.identifier;
Aşağıdaki
CommunicationIdentifier
türlerden biri olabilir:{ communicationUserId: '<ACS_USER_ID'> }
: Azure İletişim Hizmetleri kullanıcıyı temsil eden nesne.{ phoneNumber: '<E.164>' }
: Telefon numarasını E.164 biçiminde temsil eden nesne.{ microsoftTeamsUserId: '<TEAMS_USER_ID>', isAnonymous?: boolean; cloud?: "public" | "dod" | "gcch" }
: Teams kullanıcısını temsil eden nesne.{ id: string }
: diğer tanımlayıcı türlerinden herhangi birine uymayan tanımlayıcıyı temsil eden nesne
state
: Uzak katılımcının durumunu alın.
const state = remoteParticipant.state;
Durum şu şekilde olabilir:
Idle
: İlk durum.Connecting
: Katılımcı aramaya bağlanırken geçiş durumu.Ringing
: Katılımcı çaldırılıyor.Connected
: Katılımcı aramaya bağlı.Hold
: Katılımcı beklemede.EarlyMedia
: Katılımcı aramaya bağlanmadan önce çalan duyuru.InLobby
: Uzak katılımcının lobide olduğunu gösterir.Disconnected
: Son durum. Katılımcının aramayla bağlantısı kesildi. Uzak katılımcı ağ bağlantısını kaybederse durumu iki dakika sonra olarakDisconnected
değişir.
callEndReason
: Bir katılımcının aramadan neden ayrıldığını öğrenmek için özelliğini denetleyincallEndReason
:const callEndReason = remoteParticipant.callEndReason; const callEndReasonCode = callEndReason.code // (number) code associated with the reason const callEndReasonSubCode = callEndReason.subCode // (number) subCode associated with the reason
Not:
- Bu özellik yalnızca Call.addParticipant() API'sini kullanarak uzak katılımcı eklenirken ayarlanır ve örneğin uzak katılımcı reddedilir.
- UserB'nin UserC'yi tekmelediği senaryoda, UserA'nın perspektifinden UserA, UserC için bu bayrağın ayarlandığını görmüyor. Başka bir deyişle UserA, UserC'nin callEndReason özelliğinin ayarlandığını görmez.
isMuted
durum: Uzak katılımcının sesinin kapalı olup olmadığını öğrenmek için özelliğini denetleyinisMuted
. döndürürBoolean
.const isMuted = remoteParticipant.isMuted;
isSpeaking
durum: Uzak katılımcının konuştuğunu öğrenmek için özelliği denetleyinisSpeaking
. döndürürBoolean
.const isSpeaking = remoteParticipant.isSpeaking;
videoStreams
: Belirli bir katılımcının bu çağrıda gönderdiği tüm video akışlarını incelemek için koleksiyonu denetleyinvideoStreams
. Nesneleri içerirRemoteVideoStream
.const videoStreams = remoteParticipant.videoStreams; // [RemoteVideoStream, ...]
displayName
: Bu uzak katılımcının görünen adını almak için dize döndüren özelliğini inceleyindisplayName
.const displayName = remoteParticipant.displayName;
endpointDetails
: Bu uzak katılımcının tüm uç noktalarının ayrıntılarını alınconst endpointDetails: EndpointDetails[] = remoteParticipant.endpointDetails;
Not: Uzak katılımcı birçok uç noktadan gelen çağrıda olabilir ve her uç noktanın kendi benzersiz
participantId
.participantId
RemoteParticipant.identifier dosyasının ham kimliğinden farklıdır.
Diğer katılımcıların sesini kapatma
Not
Bu API'yi kullanmak için lütfen Web SDK'sı sürüm 1.26.1 veya üzerini çağıran Azure İletişim Hizmetleri kullanın.
Diğer tüm katılımcıların sesini kapatmak veya bir aramaya bağlı belirli bir katılımcının sesini kapatmak için, aramada ve mute
uzak katılımcıda zaman uyumsuz API'leri muteAllRemoteParticipants
kullanabilirsiniz. mutedByOthers
Arama'dan gelen olay, yerel katılımcı başkaları tarafından kapatıldığında oluşturulur.
Not: PSTN (telefon numarası) katılımcılarının veya 1:1 arama katılımcılarının sesini kapatma senaryoları desteklenmez.
//mute all participants except yourself
await call.muteAllRemoteParticipants();
//mute a specific participant
await call.remoteParticipants[0].mute();
Arama özelliklerini denetleme
Çağrı için benzersiz kimliği (dize) alın:
const callId: string = call.id;
Yerel katılımcı kimliğini alın:
const participantId: string = call.info.participantId;
Not: bir Azure İletişim Hizmetleri kimliği, web çağrısı SDK'sını birçok uç noktada kullanabilir ve her uç noktanın kendi benzersiz participantId
. participantId
Azure İletişim Hizmetleri kimliği ham kimliğinden farklıdır.
Teams toplantısına katılıyorsanız iş parçacığı kimliğini alın:
const threadId: string | undefined = call.info.threadId;
Arama hakkında bilgi alın:
const callInfo = call.info;
'Çağrı' örneğindeki koleksiyonu inceleyerek aramadaki remoteParticipants
diğer katılımcılar hakkında bilgi edinin:
const remoteParticipants = call.remoteParticipants;
Gelen aramanın çağıranı tanımlayın:
const callerIdentity = call.callerInfo.identifier;
identifier
türlerinden CommunicationIdentifier
biridir.
Aramanın durumunu alma:
const callState = call.state;
Bu, bir çağrının geçerli durumunu temsil eden bir dize döndürür:
None
: İlk çağrı durumu.Connecting
: Çağrı yapıldığında veya kabul edildiğinde ilk geçiş durumu.Ringing
: Giden arama için, uzak katılımcılar için bir çağrının çaldırıldığını gösterir. OnlarınIncoming
tarafında.EarlyMedia
: Çağrı bağlanmadan önce duyurunun oynatıldığı durumu gösterir.Connected
: Çağrının bağlı olduğunu gösterir.LocalHold
: Aramanın yerel bir katılımcının aramayı beklemeye koyduğunu gösterir. Yerel uç nokta ile uzak katılımcılar arasında hiçbir medya akışı yok.RemoteHold
: Uzak katılımcının aramayı beklemeye koyduğunu gösterir. Yerel uç nokta ile uzak katılımcılar arasında hiçbir medya akışı yok.InLobby
: Kullanıcının lobide olduğunu gösterir.Disconnecting
: Çağrı bir duruma geçmedenDisconnected
önceki geçiş durumu.Disconnected
: Son çağrı durumu. Ağ bağlantısı kesilirse, durum iki dakika sonra olarakDisconnected
değişir.
Özelliği inceleyerek aramanın neden sona erdiğini callEndReason
öğrenin:
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
Özelliğini inceleyerek direction
geçerli çağrının gelen mi yoksa giden mi olduğunu öğrenin. döndürür CallDirection
.
const isIncoming = call.direction == 'Incoming';
const isOutgoing = call.direction == 'Outgoing';
Koleksiyonu denetleyerek etkin video akışlarını ve etkin ekran paylaşım akışlarını inceleyin localVideoStreams
. localVideoStreams
API, , ScreenSharing
veya RawMedia
türünde Video
nesneler döndürürLocalVideoStream
.
const localVideoStreams = call.localVideoStreams;
Geçerli mikrofonun sesinin kapalı olup olmadığını denetleyin. döndürür Boolean
.
const muted = call.isMuted;
Geçerli gelen sesin (hoparlör) sesinin kapalı olup olmadığını denetleyin. döndürür Boolean
.
const incomingAudioMuted = call.isIncomingAudioMuted;
Video'nın açık olup olmadığını denetleyin. döndürür Boolean
.
const isLocalVideoStarted = call.isLocalVideoStarted;
Ekran paylaşımının açık olup olmadığını denetleyin. döndürür Boolean
.
const isScreenSharingOn = call.isScreenSharingOn;
SDK’yı yükleyin
Proje düzeyi build.gradle
dosyanızı bulun ve ve allprojects
altındaki buildscript
depolar listesine ekleyinmavenCentral()
:
buildscript {
repositories {
...
mavenCentral()
...
}
}
allprojects {
repositories {
...
mavenCentral()
...
}
}
Ardından modül düzeyi build.gradle
dosyanızda bölümüne aşağıdaki satırları dependencies
ekleyin:
dependencies {
...
implementation 'com.azure.android:azure-communication-calling:1.0.0'
...
}
Gerekli nesneleri başlatma
Örnek CallAgent
oluşturmak için bir örnekte yöntemini CallClient
çağırmanız createCallAgent
gerekir. Bu çağrı zaman uyumsuz olarak bir CallAgent
örnek nesnesi döndürür.
createCallAgent
yöntemi, bir erişim belirtecini kapsülleyen bir bağımsız değişken olarak alırCommunicationUserCredential
.
öğesine erişmek DeviceManager
için önce bir callAgent
örnek oluşturmanız gerekir. Ardından almak için DeviceManager
yöntemini kullanabilirsinizCallClient.getDeviceManager
.
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();
Çağıranın görünen adını ayarlamak için şu alternatif yöntemi kullanın:
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();
Arama yerleştirme
Bir çağrı oluşturmak ve başlatmak için yöntemini çağırmanız CallAgent.startCall()
ve Identifier
çağıranların sağlamanız gerekir.
Bir grup çağrısına katılmak için yöntemini çağırmanız CallAgent.join()
ve groupId değerini sağlamanız gerekir. Grup Kimlikleri GUID veya UUID biçiminde olmalıdır.
Çağrı oluşturma ve başlatma zaman uyumlu. Çağrı örneği, aramadaki tüm olaylara abone olmanıza olanak tanır.
Kullanıcıya 1:1 çağrısı yerleştirme
Başka bir İletişim Hizmetleri kullanıcısına çağrı yapmak için yöntemini callAgent
açın call
ve anahtarla communicationUserId
bir nesne geçirin.
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);
Kullanıcılar ve PSTN ile 1:n çağrısı yerleştirme
Not
LÜTFEN PSTN arama teklifinin ayrıntılarını denetleyin. Önizleme programı erişimi için erken benimseyen programa başvurun.
Bir kullanıcıya ve PSTN numarasına 1:n araması yapmak için arayanın telefon numarasını belirtmeniz gerekir. İletişim Hizmetleri kaynağınız PSTN çağrısına izin verecek şekilde yapılandırılmalıdır:
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);
Aramayı kabul etme
Bir çağrıyı kabul etmek için, bir çağrı nesnesinde 'accept' yöntemini çağırın.
Context appContext = this.getApplicationContext();
IncomingCall incomingCall = retrieveIncomingCall();
Call call = incomingCall.accept(context).get();
Video kamera açık bir aramayı kabul etmek için:
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();
Gelen çağrı, nesnedeki callAgent
olaya abone olarak onIncomingCall
alınabilir:
// 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;
}
Oda aramasını katılma
CallAgent
bir belirterek roomId
bir oda çağrısına katılmak için ve RoomCallLocator
kullanın. CallAgent.join
yöntemi bir Call
nesne döndürür:
val roomCallLocator = RoomCallLocator(roomId)
call = callAgent.join(applicationContext, roomCallLocator, joinCallOptions)
Uygulama room
geliştiricilerine bir aramaya kimlerin katılabileceği, ne zaman toplantı yapabilecekleri ve nasıl işbirliği yapabilecekleri üzerinde daha iyi denetim olanağı sunar. hakkında rooms
daha fazla bilgi edinmek için kavramsal belgeleri okuyabilir veya hızlı başlangıç kılavuzunu izleyebilirsiniz.
Grup çağrısına katılma
Yeni bir grup çağrısı başlatmak veya devam eden bir grup çağrısına katılmak için 'join' yöntemini çağırmanız ve özelliği olan groupId
bir nesne geçirmeniz gerekir. Değerin GUID olması gerekir.
Context appContext = this.getApplicationContext();
GroupCallLocator groupCallLocator = new GroupCallLocator("<GUID>");
JoinCallOptions joinCallOptions = new JoinCallOptions();
call = callAgent.join(context, groupCallLocator, joinCallOptions);
Çağrı özellikleri
Bu Çağrı için benzersiz kimliği alın:
String callId = call.getId();
Çağrıdaki diğer katılımcılar hakkında bilgi edinmek için örnekteki call
koleksiyonu inceleyinremoteParticipant
:
List<RemoteParticipant> remoteParticipants = call.getRemoteParticipants();
Çağrı geliyorsa arayan kimliği:
CommunicationIdentifier callerId = call.getCallerInfo().getIdentifier();
Aramanın durumunu alın:
CallState callState = call.getState();
Çağrının geçerli durumunu temsil eden bir dize döndürür:
- 'NONE' - ilk çağrı durumu
- 'EARLY_MEDIA' - Arama bağlanmadan önce duyurunun oynatıldığı durumu gösterir
- 'BAĞLANIYOR' - çağrı yerleştirildikten veya kabul edildikten sonra ilk geçiş durumu
- 'ÇALDIRMA' - giden arama için - uzak katılımcılar için aramanın çaldırılıyor olduğunu gösterir
- 'BAĞLANDI' - arama bağlandı
- 'LOCAL_HOLD' - arama yerel katılımcı tarafından beklemeye alınır, yerel uç nokta ile uzak katılımcılar arasında medya akışı yapılmaz
- 'REMOTE_HOLD' - çağrı uzak bir katılımcı tarafından beklemeye alınır, yerel uç nokta ile uzak katılımcılar arasında medya akışı yapılmaz
- 'KESİCİ' - Çağrı 'Bağlantısı kesildi' durumuna geçmeden önce geçiş durumu
- 'DISCONNECTED' - son çağrı durumu
- 'IN_LOBBY' - Teams toplantısının birlikte çalışabilirliği için lobide
Bir çağrının neden sona erdiğini öğrenmek için özelliği inceleyin callEndReason
. Kod/alt kod içerir:
CallEndReason callEndReason = call.getCallEndReason();
int code = callEndReason.getCode();
int subCode = callEndReason.getSubCode();
Geçerli çağrının bir gelen veya giden çağrı olup olmadığını görmek için özelliği inceleyin callDirection
:
CallDirection callDirection = call.getCallDirection();
// callDirection == CallDirection.INCOMING for incoming call
// callDirection == CallDirection.OUTGOING for outgoing call
Geçerli mikrofonun sesinin kapalı olup olmadığını görmek için özelliğini inceleyin muted
:
boolean muted = call.isMuted();
Etkin video akışlarını incelemek için koleksiyonu denetleyin localVideoStreams
:
List<LocalVideoStream> localVideoStreams = call.getLocalVideoStreams();
Sesi kapatma ve açma
Yerel uç noktanın sesini kapatmak veya açmak için ve unmute
zaman uyumsuz API'lerini kullanabilirsinizmute
:
Context appContext = this.getApplicationContext();
call.mute(appContext).get();
call.unmute(appContext).get();
Aramanın hacmini değiştirme
Arama sırasında, telefondaki donanım ses düzeyi tuşları kullanıcının arama ses düzeyini değiştirmesine izin vermelidir.
Bu, çağrının yerleştirildiği Etkinlikte akış türüyle AudioManager.STREAM_VOICE_CALL
yöntemi setVolumeControlStream
kullanılarak gerçekleştirilir.
Bu, donanım ses düzeyi tuşlarının aramanın ses düzeyini (telefon simgesi veya ses düzeyi kaydırıcıda benzer bir şekilde gösterilir) değiştirmesine ve alarmlar, medya veya sistem genelinde ses düzeyi gibi diğer ses profillerinin ses düzeyini değiştirmesine olanak tanır. Daha fazla bilgi için Ses çıkışındaki değişiklikleri işleme | Android Geliştiricileri.
@Override
protected void onCreate(Bundle savedInstanceState) {
...
setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
}
Uzak katılımcı yönetimi
Tüm uzak katılımcılar türle RemoteParticipant
temsil edilir ve bir çağrı örneğindeki remoteParticipants
koleksiyon aracılığıyla kullanılabilir.
Aramadaki katılımcıları listeleme
Koleksiyon, remoteParticipants
verilen çağrıdaki uzak katılımcıların listesini döndürür:
List<RemoteParticipant> remoteParticipants = call.getRemoteParticipants(); // [remoteParticipant, remoteParticipant....]
Aramaya katılımcı ekleme
Bir aramaya katılımcı eklemek için (kullanıcı veya telefon numarası) öğesini çağırabilirsiniz addParticipant
.
Bu, zaman uyumlu olarak uzak katılımcı örneğini döndürür.
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);
Katılımcıyı aramadan kaldırma
Bir katılımcıyı aramadan kaldırmak için (kullanıcı veya telefon numarası) öğesini çağırabilirsiniz removeParticipant
.
Bu, katılımcı çağrıdan kaldırıldıktan sonra zaman uyumsuz olarak çözülür.
Katılımcı da koleksiyondan remoteParticipants
kaldırılır.
RemoteParticipant acsUserRemoteParticipant = call.getParticipants().get(0);
RemoteParticipant acsPhoneRemoteParticipant = call.getParticipants().get(1);
call.removeParticipant(acsUserRemoteParticipant).get();
call.removeParticipant(acsPhoneRemoteParticipant).get();
Uzak katılımcı özellikleri
Belirli bir uzak katılımcının kendisiyle ilişkilendirilmiş bir özellik ve koleksiyon kümesi vardır:
Bu uzak katılımcının tanımlayıcısını alın. Kimlik , 'Tanımlayıcı' türlerinden biridir
CommunicationIdentifier participantIdentifier = remoteParticipant.getIdentifier();
Bu uzak katılımcının durumunu alın.
ParticipantState state = remoteParticipant.getState();
Durum şu türlerden biri olabilir:
'IDLE' - başlangıç durumu
'EARLY_MEDIA' - katılımcı aramaya bağlanmadan önce duyuru oynatılır
'ZIL' - katılımcı araması çaldırılıyor
'BAĞLANIYOR' - Katılımcı aramaya bağlanırken geçiş durumu
'BAĞLANDI' - katılımcı aramaya bağlı
'HOLD' - katılımcı beklemede
'IN_LOBBY' - katılımcı lobide kabul edilmeyi bekliyor. Şu anda yalnızca Teams birlikte çalışma senaryosunda kullanılıyor
'DISCONNECTED' - son durum - katılımcının aramayla bağlantısı kesildi
Bir katılımcının aramadan neden ayrıldığını öğrenmek için özelliği inceleyin
callEndReason
:CallEndReason callEndReason = remoteParticipant.getCallEndReason();
Bu uzak katılımcının sesinin kapalı olup olmadığını denetlemek için özelliğini inceleyin
isMuted
:boolean isParticipantMuted = remoteParticipant.isMuted();
Bu uzak katılımcının konuşup konuşmadığını denetlemek için özelliğini inceleyin
isSpeaking
:boolean isParticipantSpeaking = remoteParticipant.isSpeaking();
Belirli bir katılımcının bu çağrıda gönderdiği tüm video akışlarını incelemek için koleksiyonu denetleyin
videoStreams
:List<RemoteVideoStream> videoStreams = remoteParticipant.getVideoStreams(); // [RemoteVideoStream, RemoteVideoStream, ...]
Diğer katılımcıların sesini kapatma
Not
Bu API'yi kullanmak için lütfen Android SDK'sı 2.11.0 veya üzerini çağırma Azure İletişim Hizmetleri kullanın.
Bir çağrıdaki diğer tüm katılımcıların sesini kapatmak için çağrıdaki muteAllRemoteParticipants
API'yi kullanın.
call.muteAllRemoteParticipants();
Belirli bir uzak katılımcının sesini kapatmak için belirli bir uzak katılımcıdaki mute
API'yi kullanın.
remoteParticipant.mute();
Yerel katılımcıya başkaları tarafından sesinin kapatıldığını bildirmek için etkinliğe onMutedByOthers
abone olun.
Ön Plan Hizmetlerini Kullanma
Uygulamanız arka plandayken bile kullanıcı tarafından görünen bir görevi çalıştırmak istediğinizde Ön Plan Hizmetleri'ni kullanabilirsiniz.
Örneğin, Ön Plan Hizmetleri'ni kullanarak, uygulamanızın etkin bir çağrısı olduğunda kullanıcının görünür bildirimde kalmasını sağlayabilirsiniz. Bu şekilde, kullanıcı giriş ekranına gitse veya uygulamayı yakın zamandaki ekrandan kaldırsa bile arama etkin olmaya devam eder.
Arama sırasında Ön Plan Hizmeti kullanmıyorsanız, giriş ekranına gitmek aramayı etkin tutabilir, ancak Android işletim sistemi uygulamanızın işlemini sonlandırırsa uygulamanın en son ekranından kaldırılması aramayı durdurabilir.
Bir aramayı başlattığınızda/katıldığınızda Foreground Hizmeti'ni başlatmanız gerekir, örneğin:
call = callAgent.startCall(context, participants, options);
startService(yourForegroundServiceIntent);
Aramayı kapattığınızda veya aramanın durumu Bağlantısı kesildi olduğunda Ön Plan Hizmeti'ni durdurun, örneğin:
call.hangUp(new HangUpOptions()).get();
stopService(yourForegroundServiceIntent);
Ön Plan Hizmetleri'nin kullanımıyla ilgili notlar
Uygulama en son listeden kaldırıldığında zaten çalışan bir Ön Plan Hizmetini durdurma gibi senaryoların kullanıcı görünür bildirimini kaldıracağını ve Android işletim sisteminin uygulama işleminizi bir süre daha canlı tutabileceğini ve bu süre boyunca çağrının hala etkin olabileceğini unutmayın.
Örneğin, uygulamanız hizmet onTaskRemoved
yönteminde Ön Plan Hizmeti'ni durduruyorsa, etkinliğiniz yöntem geçersiz kılma ile yok edildiğinde ses ve videoyu durdurma gibi Etkinlik Yaşam Döngüsü'nüze göre ses ve videoyu onDestroy
başlatabilir/durdurabilir.
Sisteminizi ayarlama
Sisteminizi ayarlamak için bu adımları izleyin.
Xcode projesini oluşturma
Xcode'da yeni bir iOS projesi oluşturun ve Tek Görünüm Uygulaması şablonunu seçin. Bu makalede SwiftUI çerçevesi kullanılır, bu nedenle Dil'i Swift olarak ve Arabirim'i SwiftUI olarak ayarlamanız gerekir.
Bu makalede testler oluşturacaksınız. Testleri Dahil Et onay kutusunu temizleyebilirsiniz.
CocoaPods kullanarak paketi ve bağımlılıkları yükleme
Uygulamanız için aşağıdaki örnekte olduğu gibi bir Podfile oluşturun:
platform :ios, '13.0' use_frameworks! target 'AzureCommunicationCallingSample' do pod 'AzureCommunicationCalling', '~> 1.0.0' end
pod install
'i çalıştırın.Xcode kullanarak açın
.xcworkspace
.
Mikrofona erişim isteme
Cihazın mikrofona erişmek için kullanarak uygulamanızın bilgi özellik listesini NSMicrophoneUsageDescription
güncelleştirmeniz gerekir. İlişkili değeri, sistemin kullanıcıdan erişim istemek için kullandığı iletişim kutusuna eklenmiş bir dizeye ayarlayın.
Proje ağacının Info.plist girdisine sağ tıklayın ve Kaynak Kodu Olarak>Aç'ı seçin. Üst düzey <dict>
bölüme aşağıdaki satırları ekleyin ve dosyayı kaydedin.
<key>NSMicrophoneUsageDescription</key>
<string>Need microphone access for VOIP calling.</string>
Uygulama çerçevesini ayarlama
Projenizin ContentView.swift
dosyasını açın. Kitaplığı içeri aktarmak AzureCommunicationCalling
için dosyanın en üstüne bir import
bildirim ekleyin. Buna ek olarak, içeri aktar.AVFoundation
Koddaki ses izni istekleri için buna ihtiyacınız vardır.
import AzureCommunicationCalling
import AVFoundation
CallAgent'ı başlatma
öğesinden CallClient
bir CallAgent
örnek oluşturmak için, başlatıldıktan sonra zaman uyumsuz olarak bir nesne döndüren bir CallAgent
yöntem kullanmanız callClient.createCallAgent
gerekir.
Çağrı istemcisi oluşturmak için bir CommunicationTokenCredential
nesne geçirin:
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)
}
CommunicationTokenCredential
Oluşturduğunuz nesneyi öğesine CallClient
geçirin ve görünen adı ayarlayın:
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")
}
})
Not
Uygulama olay temsilcileri uyguladığında, olay abonelikleri gerektiren nesnelere güçlü bir başvuru barındırması gerekir. Örneğin, yöntemi çağrılırken call.addParticipant
bir RemoteParticipant
nesne döndürülürse ve uygulama temsilciyi üzerinde RemoteParticipantDelegate
dinleyecek şekilde ayarlarsa, uygulamanın nesneye güçlü bir başvuru içermesi RemoteParticipant
gerekir. Aksi takdirde, bu nesne toplanırsa, çağırma SDK'sı nesneyi çağırmaya çalıştığında temsilci önemli bir özel durum oluşturur.
Giden arama yerleştirme
Arama oluşturmak ve başlatmak için üzerindeki API'lerden CallAgent
birini çağırmanız ve İletişim Hizmetleri Yönetim SDK'sını kullanarak sağladığınız bir kullanıcının İletişim Hizmetleri kimliğini sağlamanız gerekir.
Çağrı oluşturma ve başlatma zaman uyumlu. Aramadaki tüm olaylara abone olmanıza olanak tanıyan bir çağrı örneği alırsınız.
Bir kullanıcıya 1:1 çağrısı veya kullanıcılar ve PSTN ile 1:n çağrısı yerleştirme
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")
}
}
Kullanıcılar ve PSTN ile 1:n çağrısı yerleştirme
Not
LÜTFEN PSTN arama teklifinin ayrıntılarını denetleyin. Önizleme programı erişimi için erken benimseyen programa başvurun.
PSTN'ye çağrı yapmak için İletişim Hizmetleri ile alınan bir telefon numarası belirtmeniz gerekir.
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")
}
}
Oda aramasını katılma
Bir room
çağrıya katılmak için tanımlayıcı olarak room
özelliğini belirtinroomId
. Çağrısına katılmak için yöntemini kullanın join
ve geçirin 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)
}
}
Uygulama room
geliştiricilerine bir aramaya kimlerin katılabileceği, ne zaman toplantı yapabilecekleri ve nasıl işbirliği yapabilecekleri üzerinde daha iyi denetim olanağı sunar. hakkında rooms
daha fazla bilgi edinmek için kavramsal belgeleri okuyabilir veya hızlı başlangıç kılavuzunu izleyebilirsiniz.
Grup çağrısına katılma
Bir aramaya katılmak için üzerindeki CallAgent
API'lerden birini çağırmanız gerekir.
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")
}
}
Gelen aramaya abone olma
Gelen arama olayına abone olun.
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
}
}
Gelen aramayı kabul etme
Bir çağrıyı kabul etmek için bir nesnede IncomingCall
yöntemini çağırınaccept
.
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")
}
Arama ortası işlemleri gerçekleştirme
Bir arama sırasında video ve ses ile ilgili ayarları yönetmek için çeşitli işlemler gerçekleştirebilirsiniz.
Sesi kapatma ve açma
Yerel uç noktanın sesini kapatmak veya açmak için ve unmute
zaman uyumsuz API'lerini kullanabilirsinizmute
.
call!.mute { (error) in
if error == nil {
print("Successfully muted")
} else {
print("Failed to mute")
}
}
Yerel uç noktanın sesini zaman uyumsuz olarak açmak için aşağıdaki kodu kullanın.
call!.unmute { (error) in
if error == nil {
print("Successfully un-muted")
} else {
print("Failed to unmute")
}
}
Uzak katılımcıları yönetme
Tüm uzak katılımcılar türüyle RemoteParticipant
temsil edilir ve bir çağrı örneğindeki remoteParticipants
koleksiyon aracılığıyla kullanılabilir.
Aramadaki katılımcıları listeleme
call.remoteParticipants
Aramaya katılımcı ekleme
Bir aramaya (kullanıcı veya telefon numarası) katılımcı eklemek için öğesini çağırabilirsiniz addParticipant
. Bu komut zaman uyumlu olarak uzak bir katılımcı örneği döndürür.
let remoteParticipantAdded: RemoteParticipant = call.add(participant: CommunicationUserIdentifier(identifier: "userId"))
Bir katılımcıyı aramadan kaldırma
Bir katılımcıyı aramadan (kullanıcı veya telefon numarası) kaldırmak için API'yi removeParticipant
çağırabilirsiniz. Bu, zaman uyumsuz olarak çözülür.
call!.remove(participant: remoteParticipantAdded) { (error) in
if (error == nil) {
print("Successfully removed participant")
} else {
print("Failed to remove participant")
}
}
Uzak katılımcı özelliklerini alma
// [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, ...]
Diğer katılımcıların sesini kapatma
Not
Bu API'yi kullanmak için lütfen Azure İletişim Hizmetleri iOS SDK sürüm 2.13.0 veya üzerini çağırın.
Bir çağrıdaki diğer tüm katılımcıların sesini kapatmak için çağrıdaki muteAllRemoteParticipants
API'yi kullanın.
call!.muteAllRemoteParticipants { (error) in
if error == nil {
print("Successfully muted all remote participants.")
} else {
print("Failed to mute remote participants.")
}
}
Belirli bir uzak katılımcının sesini kapatmak için belirli bir uzak katılımcıdaki mute
API'yi kullanın.
remoteParticipant.mute { (error) in
if error == nil {
print("Successfully muted participant.")
} else {
print("Failed to mute participant.")
}
}
Yerel katılımcıya başkaları tarafından sesinin kapatıldığını bildirmek için etkinliğe onMutedByOthers
abone olun.
Sisteminizi ayarlama
Sisteminizi ayarlamak için bu adımları izleyin.
Visual Studio projesini oluşturma
Evrensel Windows Platformu bir uygulama için Visual Studio 2022'de yeni bir Boş Uygulama (Evrensel Windows) projesi oluşturun. Proje adını girdikten sonra, 10.0.17763.0'dan sonraki bir Windows SDK'sını seçebilirsiniz.
WinUI 3 uygulaması için, tek sayfalı bir WinUI 3 uygulaması ayarlamak için Boş Uygulama, Paketlenmiş (Masaüstünde WinUI 3) şablonuyla yeni bir proje oluşturun. Windows Uygulama SDK'sı sürüm 1.3 veya üzeri gereklidir.
NuGet Paket Yöneticisi kullanarak paketi ve bağımlılıkları yükleme
Arama SDK'sı API'leri ve kitaplıkları bir NuGet paketi aracılığıyla genel kullanıma sunulur.
Arama SDK'sı NuGet paketini bulmak, indirmek ve yüklemek için:
- Araçlar>NuGet Paket Yöneticisi Çözüm için NuGet Paketlerini Yönet'i seçerek NuGet Paket Yöneticisi> açın.
- Gözat'ı seçin ve arama kutusuna Azure.Communication.Calling.WindowsClient yazın.
- Ön sürümü dahil et onay kutusunun seçili olduğundan emin olun.
- Azure.Communication.Calling.WindowsClient paketini ve ardından Azure.Communication.Calling.WindowsClient 1.4.0-beta.1 veya daha yeni bir sürümü seçin.
- Sağ bölmedeki Azure İletişim Hizmetleri projeye karşılık gelen onay kutusunu seçin.
- Yükle'yi seçin.
Mikrofona erişim isteme
Uygulamanın düzgün çalışması için mikrofona erişim gerekir. UWP uygulamalarında, mikrofon özelliği uygulama bildirim dosyasında bildirilmelidir.
Aşağıdaki adımlar bunun nasıl başarıldığını gösterir.
- Panelde
Solution Explorer
uzantılı.appxmanifest
dosyaya çift tıklayın. - Sekmeye
Capabilities
tıklayın. Microphone
Yetenekler listesinden onay kutusunu seçin.
Aramayı yerleştirmek ve kapatmak için kullanıcı arabirimi düğmeleri oluşturma
Bu basit örnek uygulama iki düğme içerir. Biri aramayı yapmak için, diğeri ise aramayı kapatmak için. Aşağıdaki adımlar, bu düğmelerin uygulamaya nasıl ekleneceğini gösterir.
- Panelde
Solution Explorer
UWP veyaMainWindows.xaml
WinUI 3 için adlıMainPage.xaml
dosyaya çift tıklayın. - Merkezi panelde kullanıcı arabirimi önizlemesi altında XAML kodunu arayın.
- XAML kodunu aşağıdaki alıntıyla değiştirin:
<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>
Uygulamayı SDK API'lerini çağırma ile ayarlama
Çağrı SDK'sı API'leri iki farklı ad alanındadır. Aşağıdaki adımlar, Visual Studio'nun IntelliSense'inin kod geliştirmeye yardımcı olmasını sağlayan bu ad alanları hakkında C# derleyicisini bilgilendirmektedir.
- Panelde
Solution Explorer
, dosyanın sol tarafındaki UWP veyaMainWindows.xaml
WinUI 3 için adlıMainPage.xaml
oka tıklayın. - veya
MainWindows.xaml.cs
adlıMainPage.xaml.cs
dosyaya çift tıklayın. - Geçerli
using
deyimlerin en altına aşağıdaki komutları ekleyin.
using Azure.Communication.Calling.WindowsClient;
Açık veya MainWindows.xaml.cs
açık tutunMainPage.xaml.cs
. Sonraki adımlarda bu koda daha fazla kod eklenir.
Uygulama etkileşimlerine izin ver
Daha önce eklenen kullanıcı arabirimi düğmelerinin yerleştirilen CommunicationCall
üzerinde çalışması gerekir. Bu, bir CommunicationCall
veri üyesinin veya MainWindow
sınıfına MainPage
eklenmesi gerektiği anlamına gelir.
Ayrıca, zaman uyumsuz işlemin başarılı CallAgent
olması için veri CallAgent
üyesinin de aynı sınıfa eklenmesi gerekir.
Aşağıdaki veri üyelerini pr MainWindow
sınıfına MainPage
ekleyin:
CallAgent callAgent;
CommunicationCall call;
Düğme işleyicileri oluşturma
Daha önce XAML koduna iki kullanıcı arabirimi düğmesi eklendi. Aşağıdaki kod, kullanıcı düğmeyi seçtiğinde yürütülecek işleyicileri ekler. Aşağıdaki kod, önceki bölümdeki veri üyelerinden sonra eklenmelidir.
private async void CallButton_Click(object sender, RoutedEventArgs e)
{
// Start call
}
private async void HangupButton_Click(object sender, RoutedEventArgs e)
{
// End the current call
}
Nesne modeli
Aşağıdaki sınıflar ve arabirimler Azure İletişim Hizmetleri UWP için istemci kitaplığını çağırmanın bazı önemli özelliklerini işler.
Veri Akışı Adı | Açıklama |
---|---|
CallClient |
CallClient , çağrı istemci kitaplığının ana giriş noktasıdır. |
CallAgent |
CallAgent çağrıları başlatmak ve katılmak için kullanılır. |
CommunicationCall |
CommunicationCall , yerleştirilen veya birleştirilen çağrıları yönetmek için kullanılır. |
CommunicationTokenCredential |
, CommunicationTokenCredential örneğini CallAgent başlatmak için belirteç kimlik bilgisi olarak kullanılır. |
CallAgentOptions |
, CallAgentOptions çağıranı tanımlamak için bilgileri içerir. |
HangupOptions |
Aramanın HangupOptions tüm katılımcılarına sonlandırılıp sonlandırılmadığını bildirir. |
CallAgent'ı başlatma
öğesinden CallClient
bir CallAgent
örnek oluşturmak için, başlatıldıktan sonra bir nesneyi zaman uyumsuz olarak döndüren yöntemi CallAgent
kullanmanız CallClient.CreateCallAgentAsync
gerekir.
oluşturmak CallAgent
için bir CallTokenCredential
nesne ve CallAgentOptions
bir nesne geçirmeniz gerekir. Hatalı biçimlendirilmiş bir belirteç geçirilirse atıldığını unutmayın CallTokenCredential
.
Aşağıdaki kod içine eklenmelidir ve yardımcı işlevi uygulama başlatmada çağrılmalıdır.
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);
<AUTHENTICATION_TOKEN>
değerini kaynağınız için geçerli bir kimlik bilgisi belirteci ile değiştirin. Kimlik bilgisi belirtecinin kaynaklanması gerekiyorsa kullanıcı erişim belirteci belgelerine bakın.
CallAgent oluşturma ve arama yerleştirme
oluşturmak CallAgent
için gereken nesneler artık hazır. Zaman uyumsuz olarak bir çağrı oluşturma CallAgent
ve yerleştirme zamanı geldi.
Önceki adımdaki özel durum işlendikten sonra aşağıdaki kod eklenmelidir.
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;
Azure İletişim Hizmetleri yankı botuyla konuşmaktan çekinmeyin8:echo123
.
Sesi kapatma ve açma
Giden sesi kapatmak veya açmak için ve UnmuteOutgoingAudioAsync
zaman uyumsuz API'lerini kullanabilirsinizMuteOutgoingAudioAsync
:
// mute outgoing audio
await this.call.MuteOutgoingAudioAsync();
// unmute outgoing audio
await this.call.UnmuteOutgoingAudioAsync();
Diğer katılımcıların sesini kapatma
Not
Bu API'yi kullanmak için lütfen Windows SDK 1.9.0 veya üzerini çağırma Azure İletişim Hizmetleri kullanın.
Diğer tüm katılımcıların sesini kapatmak veya belirli bir katılımcının sesini kapatmak için, aramada ve MuteAsync
uzak katılımcıda zaman uyumsuz API'leri MuteAllRemoteParticipantsAsync
kullanabilirsiniz:
// mute all participants except yourself
await this.call.MuteAllRemoteParticipantsAsync();
// mute specific participant in the call
await this.call.RemoteParticipants.FirstOrDefault().MuteAsync();
Yerel katılımcıya başkaları tarafından sesinin kapatıldığını bildirmek için etkinliğe MutedByOthers
abone olun.
Aramayı sonlandırma
Bir çağrı yerleştirildikten sonra, HangupAsync
çağrıyı CommunicationCall
kapatmak için nesnesinin yöntemi kullanılmalıdır.
Çağrısının HangupOptions
tüm katılımcılarına sonlandırılıp sonlandırılmaması gerektiğini bildirmek için bir örneği de kullanılmalıdır.
aşağıdaki kod içine HangupButton_Click
eklenmelidir.
this.call.OnStateChanged -= Call_OnStateChangedAsync;
await this.call.HangUpAsync(new HangUpOptions() { ForEveryone = false });
Kodu çalıştırma
Visual Studio'da uygulamasının , x86
veya ARM64
için derlediğinden emin olun, ardından uygulamayı çalıştırmaya başlamak için x64
hit tuşuna basınF5
. Bundan sonra, tanımlanan çağrıyı aramak için düğmeye tıklayın Call
.
Uygulama ilk kez çalıştırıldığında sistemin kullanıcıdan mikrofona erişim izni vermesi istendiğini unutmayın.