Aracılığıyla paylaş


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

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ı createCallAgentyaparak 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 deviceManageriç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çersiz Call Agent örnekse bu hatayla bağlantı kesilir.
  • connectionIssue: İstemcinin Microsoft infrascture'a bağlanmasıyla ilgili bir sorun varsa, birçok yeniden denemeden Call Agent sonra hata ortaya connectionIssue çı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 roomsdaha 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 LocalHoldayarlanı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 LocalHoldneden 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 Connectedayarlanı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ğıdaki CommunicationIdentifier 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 olarak Disconnected değişir.
  • callEndReason: Bir katılımcının aramadan neden ayrıldığını öğrenmek için özelliğini denetleyin callEndReason :

    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 denetleyin isMuted . döndürür Boolean.

    const isMuted = remoteParticipant.isMuted;
    
  • isSpeaking durum: Uzak katılımcının konuştuğunu öğrenmek için özelliği denetleyin isSpeaking . döndürür Boolean.

    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 denetleyin videoStreams . Nesneleri içerir RemoteVideoStream .

    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 inceleyin displayName .

    const displayName = remoteParticipant.displayName;
    
  • endpointDetails: Bu uzak katılımcının tüm uç noktalarının ayrıntılarını alın

        const 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. participantIdAzure İ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ın Incoming 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çmeden Disconnected önceki geçiş durumu.
  • Disconnected: Son çağrı durumu. Ağ bağlantısı kesilirse, durum iki dakika sonra olarak Disconnected 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, , ScreenSharingveya RawMediatüründe Videonesneler 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 allprojectsaltı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 DeviceManageriçin önce bir callAgent örnek oluşturmanız gerekir. Ardından almak için DeviceManageryö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 roomIdbir 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 roomsdaha 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.

Xcode içinde proje oluşturma penceresini gösteren ekran görüntüsü.

CocoaPods kullanarak paketi ve bağımlılıkları yükleme

  1. 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
    
  2. pod install'i çalıştırın.

  3. Xcode kullanarak açın .xcworkspace .

Mikrofona erişim isteme

Cihazın mikrofona erişmek için kullanarak uygulamanızın bilgi özellik listesini NSMicrophoneUsageDescriptiongü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 CallClientbir 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 CallClientgeç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 RemoteParticipantDelegatedinleyecek ş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 roomsdaha 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 CallAgentAPI'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:

  1. Araçlar>NuGet Paket Yöneticisi Çözüm için NuGet Paketlerini Yönet'i seçerek NuGet Paket Yöneticisi> açın.
  2. Gözat'ı seçin ve arama kutusuna Azure.Communication.Calling.WindowsClient yazın.
  3. Ön sürümü dahil et onay kutusunun seçili olduğundan emin olun.
  4. 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.
  5. Sağ bölmedeki Azure İletişim Hizmetleri projeye karşılık gelen onay kutusunu seçin.
  6. 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.

  1. Panelde Solution Explorer uzantılı .appxmanifest dosyaya çift tıklayın.
  2. Sekmeye Capabilities tıklayın.
  3. 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.

  1. Panelde Solution Explorer UWP veya MainWindows.xaml WinUI 3 için adlı MainPage.xaml dosyaya çift tıklayın.
  2. Merkezi panelde kullanıcı arabirimi önizlemesi altında XAML kodunu arayın.
  3. 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.

  1. PaneldeSolution Explorer, dosyanın sol tarafındaki UWP veya MainWindows.xaml WinUI 3 için adlı MainPage.xaml oka tıklayın.
  2. veya MainWindows.xaml.csadlı MainPage.xaml.cs dosyaya çift tıklayın.
  3. 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 CallAgentbaş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 CallClientbir 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 CallAgentiç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_Clickeklenmelidir.

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 ARM64için derlediğinden emin olun, ardından uygulamayı çalıştırmaya başlamak için x64hit 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.

Sonraki adımlar