Mengelola panggilan

Pelajari cara mengelola panggilan dengan Azure Communication Services SDKS. Kami akan belajar cara melakukan panggilan, mengelola peserta dan properti mereka.

Prasyarat

Pasang SDK

npm install Gunakan perintah untuk menginstal SDK Umum dan Panggilan Azure Communication Services untuk JavaScript:

npm install @azure/communication-common --save
npm install @azure/communication-calling --save

Menginisialisasi objek yang diperlukan

Instans CallClient diperlukan untuk sebagian besar operasi panggilan. Saat membuat instans baru CallClient , Anda dapat mengonfigurasinya dengan opsi kustom seperti Logger instans.

CallClient Dengan instans, Anda dapat membuat CallAgent instans dengan memanggil createCallAgent. Metode ini secara asinkron mengembalikan objek instans CallAgent.

Metode createCallAgent menggunakan CommunicationTokenCredential sebagai argumen. Hal ini menerima token akses pengguna.

Anda dapat menggunakan metode getDeviceManager pada instans CallClient untuk mengakses deviceManager.

const { CallClient } = require('@azure/communication-calling');
const { AzureCommunicationTokenCredential} = require('@azure/communication-common');
const { AzureLogger, setLogLevel } = require("@azure/logger");

// Set the logger's log level
setLogLevel('verbose');

// Redirect log output to console, file, buffer, REST API, or whatever location you want
AzureLogger.log = (...args) => {
    console.log(...args); // Redirect log output to console
};

const userToken = '<USER_TOKEN>';
callClient = new CallClient(options);
const tokenCredential = new AzureCommunicationTokenCredential(userToken);
const callAgent = await callClient.createCallAgent(tokenCredential, {displayName: 'optional Azure Communication Services user name'});
const deviceManager = await callClient.getDeviceManager()

Melakukan panggilan

Untuk membuat dan memulai panggilan, gunakan salah satu API di callAgent dan berikan pengguna yang Anda buat melalui SDK identitas Communication Services.

Pembuatan dan permulaan panggilan bersifat sinkron. Instans call memungkinkan Anda untuk berlangganan acara panggilan.

Melakukan panggilan 1:n ke pengguna atau PSTN

Untuk memanggil pengguna Communication Services lain, menggunakan metode startCall di callAgent dan meneruskan CommunicationUserIdentifier penerima yang Anda buat dengan perpustakaan administrasi Communication Services.

Untuk panggilan "1:1" ke pengguna, gunakan kode berikut:

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

Untuk melakukan panggilan ke jaringan telepon umum (PSTN), gunakan metode startCall di callAgent dan meneruskan PhoneNumberIdentifier penerima. Sumber daya Communication Services Anda harus dikonfigurasi untuk mengizinkan panggilan PSTN.

Saat Anda memanggil nomor PSTN, tentukan ID penelepon alternatif Anda. ID penelepon alternatif adalah nomor telepon (berdasarkan standar E.164) yang mengidentifikasi penelepon dalam panggilan PSTN. Hal ini adalah nomor telepon yang dilihat oleh penerima panggilan untuk panggilan masuk.

Catatan

Silakan periksa detail penawaran panggilan PSTN. Untuk akses program pratinjau, berlaku untuk program pengadopsi awal.

Untuk panggilan 1:1 ke nomor PSTN, gunakan kode berikut:

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

Untuk panggilan 1:n ke nomor PSTN dan pengguna, gunakan kode berikut:

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

Bergabung dengan panggilan ruang

Untuk bergabung dengan room panggilan, Anda dapat membuat instans objek konteks dengan roomId properti sebagai room pengidentifikasi. Untuk bergabung dengan panggilan, gunakan join metode dan berikan instans konteks.

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

A room menawarkan pengembang aplikasi kontrol yang lebih baik atas siapa yang dapat bergabung dengan panggilan, ketika mereka bertemu dan bagaimana mereka berkolaborasi. Untuk mempelajari selengkapnya tentang rooms, Anda dapat membaca dokumentasi konseptual atau mengikuti panduan mulai cepat.

Bergabunglah dengan panggilan grup

Catatan

Parameter groupId dianggap sebagai metadata sistem dan dapat digunakan oleh Microsoft untuk operasi yang diperlukan untuk menjalankan sistem. Jangan sertakan data pribadi dalam nilai groupId. Microsoft tidak memperlakukan parameter ini sebagai data pribadi dan kontennya dapat dilihat oleh karyawan Microsoft atau disimpan dalam jangka panjang.

Parameter groupId memerlukan data dalam format GUID. Sebaiknya gunakan GUID yang dibuat secara acak yang tidak dianggap sebagai data pribadi di sistem Anda.

Untuk memulai panggilan grup baru atau bergabung dengan panggilan grup yang sedang berlangsung, gunakan metode join dan berikan objek dengan properti groupId. Nilai groupId harus berupa GUID.

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

Menerima panggilan masuk

Instans callAgent mengeluarkan peristiwa incomingCall saat identitas masuk menerima panggilan masuk. Untuk mendengarkan acara ini, berlangganan dengan menggunakan salah satu opsi berikut:

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

Peristiwa incomingCall mencakup kejadian incomingCall yang dapat Anda terima atau tolak.

Azure Communication Calling SDK menaikkan kameraStartFailed: true call diagnostic jika kamera tidak tersedia saat memulai, menerima, atau bergabung dengan panggilan dengan video diaktifkan. Dalam hal ini, panggilan dimulai dengan video nonaktif. Kamera mungkin tidak tersedia karena sedang digunakan oleh proses lain atau karena dinonaktifkan dalam sistem operasi.

Tangguhkan dan lanjutkan panggilan

Catatan

Pada saat tertentu, seharusnya hanya ada 1 panggilan aktif (dalam Connected status, dengan media aktif). Semua panggilan lain harus ditangguhkan oleh pengguna, atau secara terprogram oleh aplikasi. Ini umum dalam skenario seperti pusat kontak, di mana pengguna mungkin perlu menangani beberapa panggilan keluar dan masuk, semua panggilan tidak aktif harus ditangguhkan, dan pengguna harus berinteraksi dengan orang lain hanya dalam panggilan aktif

Untuk menahan atau melanjutkan panggilan, Anda dapat menggunakan hold API asinkron dan resume :

Untuk menahan panggilan

await call.hold();

Ketika hold API diselesaikan, status panggilan diatur ke LocalHold. Dalam panggilan 1:1, peserta lain juga ditangguhkan, dan status panggilan dari perspektif peserta tersebut diatur ke 'RemoteHold'. Kemudian, peserta lain mungkin menangguhkan panggilannya, yang akan mengakibatkan perubahan status menjadi LocalHold. Dalam panggilan grup atau rapat - hold adalah operasi lokal, itu tidak menahan panggilan untuk peserta panggilan lain. Untuk melanjutkan panggilan, semua pengguna yang memulai penahanan harus melanjutkannya.

Untuk melanjutkan panggilan dari penangguhkan:

await call.resume();

resume Ketika API diselesaikan, status panggilan diatur lagi ke Connected.

Mematikan suara dan menyalakan suara panggilan

Untuk menonaktifkan atau mengaktifkan titik akhir lokal, Anda dapat menggunakan mute dan unmute API asinkron:

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

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

Mematikan suara dan menyalakan suara audio masuk

Mematikan suara audio masuk mengatur volume panggilan ke 0. Untuk mematikan atau menyalakan suara audio masuk, Anda dapat menggunakan muteIncomingAudio API asinkron dan unmuteIncomingAudio :

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

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

Saat audio masuk dibisukan, SDK klien peserta masih menerima audio panggilan (audio peserta jarak jauh). Audio panggilan tidak terdengar di pembicara dan peserta tidak dapat mendengarkan hingga 'call.unmuteIncomingAudio()' dipanggil. Namun, kita dapat menerapkan filter pada audio panggilan dan memutar audio yang difilter.

Mematikan suara peserta lain

Catatan

API ini disediakan sebagai pratinjau untuk pengembang dan dapat berubah menurut umpan balik yang kami terima. Untuk menggunakan API ini, gunakan rilis 'beta' dari Azure Communication Services Calling Web SDK versi 1.18.1 atau yang lebih tinggi.

Untuk mematikan suara semua peserta lain atau mematikan suara peserta tertentu, Anda dapat menggunakan API muteAllRemoteParticipants asinkron pada panggilan dan mute pada peserta jarak jauh:

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

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

Kelola peserta jarak jauh

Semua peserta jarak jauh dirinci dalam RemoteParticipant objek dan tersedia melalui remoteParticipants koleksi pada instans panggilan. remoteParticipants dapat diakses dari Call instans.

Daftar peserta dalam panggilan

Koleksi remoteParticipants mengembalikan daftar peserta jarak jauh dalam panggilan:

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

Menambahkan peserta ke panggilan

Untuk menambahkan peserta (baik pengguna atau nomor telepon) ke panggilan, Anda dapat menggunakan addParticipant API. Memberikan salah satu dari Identifier jenis. Hal ini secara sinkron mengembalikan instans remoteParticipant. Acara remoteParticipantsUpdated dari Panggilan dimunculkan saat peserta berhasil ditambahkan ke panggilan.

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

Hapus peserta dari panggilan

Untuk menghapus peserta (baik pengguna atau nomor telepon) dari panggilan, Anda dapat memanggil removeParticipant. Anda harus melewati salah satu dari Identifier jenis. Metode ini diselesaikan secara asinkron setelah peserta dihapus dari panggilan. Peserta juga dihapus dari koleksi remoteParticipants.

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

Mengakses properti peserta jarak jauh

Peserta jarak jauh memiliki seperangkat properti dan koleksi terkait:

  • CommunicationIdentifier: Mendapatkan pengidentifikasi untuk peserta jarak jauh. Identitas adalah salah satu dari CommunicationIdentifier jenis:
const identifier = remoteParticipant.identifier;
  • Hal ini dapat berupa salah satu dari CommunicationIdentifier jenis berikut:

    • { communicationUserId: '<ACS_USER_ID'> }: Objek yang mewakili pengguna Azure Communication Services.
    • { phoneNumber: '<E.164>' }: Objek yang mewakili nomor telepon dalam format E.164.
    • { microsoftTeamsUserId: '<TEAMS_USER_ID>', isAnonymous?: boolean; cloud?: "public" | "dod" | "gcch" }: Objek yang mewakili pengguna Teams.
    • { id: string }: pengidentifikasi representasi objek yang tidak cocok dengan jenis pengidentifikasi lainnya
  • state: Mendapatkan status peserta jarak jauh.

const state = remoteParticipant.state;
  • Status dapat berupa:

    • Idle: Status awal.
    • Connecting: Status transisi saat peserta tersambung ke panggilan.
    • Ringing: Peserta menelepon.
    • Connected: Peserta tersambung ke panggilan.
    • Hold: Peserta ditangguhkan.
    • EarlyMedia: Pengumuman yang diputar sebelum peserta tersambung ke panggilan.
    • InLobby: Menunjukkan bahwa peserta jarak jauh berada di lobi.
    • Disconnected: Status akhir. Peserta terputus dari panggilan. Jika peserta jarak jauh kehilangan konektivitas jaringan, statusnya berubah menjadi Disconnected setelah dua menit.
  • callEndReason: Untuk mempelajari alasan peserta meninggalkan panggilan, periksa properti 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
    

    Catatan:

    • Properti ini hanya diatur saat menambahkan peserta jarak jauh melalui API Call.addParticipant(), dan peserta jarak jauh menolak misalnya.
    • Dalam skenario, di mana UserB menendang UserC, dari perspektif UserA, UserA tidak melihat bendera ini diatur untuk UserC. Dengan kata lain, UserA tidak melihat properti callEndReason UserC diatur.
  • isMuted status: Untuk mengetahui apakah peserta jarak jauh dibisukan, periksa properti isMuted. Hal ini mengembalikan Boolean.

    const isMuted = remoteParticipant.isMuted;
    
  • isSpeaking status: Untuk mengetahui apakah peserta jarak jauh berbicara, periksa properti isSpeaking. Hal ini mengembalikan Boolean.

    const isSpeaking = remoteParticipant.isSpeaking;
    
  • videoStreams: Untuk memeriksa semua aliran video yang dikirim oleh peserta tertentu dalam panggilan ini, periksa koleksi videoStreams. Hal ini berisi RemoteVideoStream objek.

    const videoStreams = remoteParticipant.videoStreams; // [RemoteVideoStream, ...]
    
  • displayName: Untuk mendapatkan nama tampilan untuk peserta jarak jauh ini, periksa properti displayName yang dikembalikan string.

    const displayName = remoteParticipant.displayName;
    
  • endpointDetails: Dapatkan detail semua titik akhir untuk peserta jarak jauh ini

        const endpointDetails: EndpointDetails[] = remoteParticipant.endpointDetails;
    

    Catatan: Peserta jarak jauh dapat berada dalam panggilan dari banyak titik akhir, dan setiap titik akhir memiliki keunikannya participantIdsendiri. participantId berbeda dari ID mentah RemoteParticipant.identifier.

Periksa properti panggilan

Mendapatkan ID unik (string) untuk panggilan:

const callId: string = call.id;

Dapatkan ID peserta lokal:

const participantId: string = call.info.participantId;

Catatan: Identitas Azure Communication Services dapat menggunakan SDK panggilan web di banyak titik akhir, dan setiap titik akhir memiliki keunikannya participantIdsendiri. participantId berbeda dari ID mentah identitas Azure Communication Services.

Ambil ID utas jika bergabung dalam rapat Teams:

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

Mendapatkan informasi tentang panggilan:

const callInfo = call.info;

Pelajari tentang peserta lain dalam panggilan dengan memeriksa koleksi remoteParticipants pada instans 'panggilan':

const remoteParticipants = call.remoteParticipants;

Mengidentifikasi penelepon dari panggilan masuk:

const callerIdentity = call.callerInfo.identifier;

identifier adalah salah satu dari CommunicationIdentifier jenis.

Mendapatkan status panggilan:

const callState = call.state;

Hal ini mengembalikan string yang mewakili status panggilan saat ini:

  • None: Status panggilan awal.
  • Connecting: Status transisi awal saat panggilan dilakukan atau diterima.
  • Ringing: Untuk panggilan keluar, menunjukkan bahwa ada panggilan berdering untuk peserta jarak jauh. Hal ini Incoming di pihak mereka.
  • EarlyMedia: Menunjukkan keadaan di mana pengumuman dimainkan sebelum panggilan tersambung.
  • Connected: Menunjukkan bahwa panggilan tersambung.
  • LocalHold: Menunjukkan bahwa peserta lokal panggilan menangguhkan panggilan. Tidak ada media yang mengalir antara titik akhir lokal dan peserta jarak jauh.
  • RemoteHold: Menunjukkan bahwa peserta jarak jauh panggilan menangguhkan panggilan. Tidak ada media yang mengalir antara titik akhir lokal dan peserta jarak jauh.
  • InLobby: Menunjukkan bahwa pengguna berada di lobi.
  • Disconnecting: Status transisi sebelum panggilan beralih ke status Disconnected.
  • Disconnected: Status panggilan terakhir. Jika koneksi jaringan terputus, statusnya berubah menjadi Disconnected setelah dua menit.

Cari tahu mengapa panggilan berakhir dengan memeriksa properti callEndReason:

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

Mempelajari apakah panggilan saat ini masuk atau keluar dengan memeriksa properti direction. Hal ini mengembalikan CallDirection.

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

Periksa aliran video aktif dan aliran berbagi layar aktif dengan memeriksa localVideoStreams koleksi. localVideoStreams API mengembalikan LocalVideoStream objek jenis Video, , ScreenSharingatau RawMedia.

const localVideoStreams = call.localVideoStreams;

Periksa apakah mikrofon saat ini dimatikan. Hal ini mengembalikan Boolean.

const muted = call.isMuted;

Periksa apakah audio masuk (speaker) saat ini dibisukan. Hal ini mengembalikan Boolean.

const incomingAudioMuted = call.isIncomingAudioMuted;

Periksa apakah video aktif. Hal ini mengembalikan Boolean.

const isLocalVideoStarted = call.isLocalVideoStarted;

Periksa apakah berbagi layar aktif. Hal ini mengembalikan Boolean.

const isScreenSharingOn = call.isScreenSharingOn;

Pasang SDK

Temukan file build.gradle tingkat proyek Anda dan tambahkan mavenCentral() ke daftar repositori di bawah buildscript dan allprojects:

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

Kemudian, di file build.gradle tingkat modul Anda, tambahkan baris berikut ke bagian dependencies :

dependencies {
    ...
    implementation 'com.azure.android:azure-communication-calling:1.0.0'
    ...
}

Menginisialisasi objek yang diperlukan

Untuk membuat CallAgent instans, Anda harus memanggil createCallAgent metode pada CallClient instans. Panggilan ini secara asinkron mengembalikan objek instans CallAgent .

Metode ini createCallAgent mengambil CommunicationUserCredential sebagai argumen, yang merangkum token akses.

Untuk mengakses DeviceManager, Anda harus membuat instans terlebih callAgent dahulu. Kemudian Anda dapat menggunakan CallClient.getDeviceManager metode untuk mendapatkan DeviceManager.

String userToken = '<user token>';
CallClient callClient = new CallClient();
CommunicationTokenCredential tokenCredential = new CommunicationTokenCredential(userToken);
android.content.Context appContext = this.getApplicationContext(); // From within an activity, for instance
CallAgent callAgent = callClient.createCallAgent(appContext, tokenCredential).get();
DeviceManager deviceManager = callClient.getDeviceManager(appContext).get();

Untuk mengatur nama tampilan penelepon, gunakan metode alternatif ini:

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

Melakukan panggilan

Untuk membuat dan memulai panggilan, Anda perlu memanggil metode CallAgent.startCall()dan menyediakan penerima panggilan Identifier. Untuk bergabung dalam panggilan grup, Anda perlu memanggil CallAgent.join() metode dan menyediakan groupId. ID Grup harus dalam format GUID atau UUID.

Pembuatan dan permulaan panggilan bersifat sinkron. Instans panggilan memungkinkan Anda berlangganan ke semua peristiwa pada panggilan.

Lakukan panggilan 1:1 ke pengguna

Untuk melakukan panggilan ke pengguna Communication Services lain, panggil metode call pada callAgent dan teruskan objek dengan kunci communicationUserId.

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

Melakukan panggilan 1:n dengan pengguna dan PSTN

Catatan

Silakan periksa detail penawaran panggilan PSTN. Untuk akses program pratinjau, berlaku untuk program pengadopsi awal.

Untuk melakukan panggilan 1:n ke pengguna dan nomor PSTN, Anda harus menentukan nomor telepon penerima panggilan. Sumber daya Communication Services Anda harus dikonfigurasi untuk mengizinkan panggilan PSTN:

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

Terima panggilan

Untuk menerima panggilan, hubungi metode 'terima' pada objek panggilan.

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

Untuk menerima panggilan dengan kamera video aktif:

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

Panggilan masuk dapat diperoleh dengan berlangganan onIncomingCall peristiwa pada callAgent objek:

// 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;
}

Bergabung dengan panggilan ruang

CallAgent Gunakan dan RoomCallLocator untuk bergabung dengan panggilan ruang dengan menentukan roomId. Metode CallAgent.join akan mengembalikan Call objek:

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

A room menawarkan pengembang aplikasi kontrol yang lebih baik atas siapa yang dapat bergabung dengan panggilan, ketika mereka bertemu dan bagaimana mereka berkolaborasi. Untuk mempelajari selengkapnya tentang rooms, Anda dapat membaca dokumentasi konseptual atau mengikuti panduan mulai cepat.

Bergabunglah dengan panggilan grup

Untuk memulai panggilan grup baru atau bergabung dalam panggilan grup yang sedang berlangsung, Anda harus memanggil metode 'gabung' dan meneruskan objek dengan properti groupId. Nilai harus berupa GUID.

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

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

Properti panggilan

Dapatkan ID unik untuk Panggilan ini:

String callId = call.getId();

Untuk mempelajari tentang peserta lain dalam koleksi panggilan, periksa remoteParticipant koleksi pada call instans:

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

Identitas penelepon jika panggilan masuk:

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

Dapatkan status Panggilan:

CallState callState = call.getState();

Hal ini mengembalikan string yang mewakili status panggilan saat ini:

  • 'NONE' - status panggilan awal
  • 'EARLY_MEDIA' - menunjukkan status di mana pengumuman diputar sebelum panggilan tersambung
  • 'CONNECTING' - status transisi awal setelah panggilan dilakukan atau diterima
  • 'RINGING' - untuk panggilan keluar - menunjukkan panggilan berdering untuk peserta jarak jauh
  • 'CONNECTED' - panggilan tersambung
  • 'LOCAL_HOLD' - panggilan ditunda oleh peserta lokal, tidak ada media yang mengalir antara titik akhir lokal dan peserta jarak jauh
  • 'REMOTE_HOLD' - panggilan ditunda oleh peserta jarak jauh, tidak ada media yang mengalir antara titik akhir lokal dan peserta jarak jauh
  • 'DISCONNECTING' - status transisi sebelum panggilan masuk ke status 'Terputus'
  • 'DISCONNECTED' - status panggilan akhir
  • 'IN_LOBBY' - di lobi untuk interoperabilitas rapat Teams

Untuk mengetahui mengapa panggilan diakhiri, periksa callEndReason properti. Properti tersebut berisi kode/subkode:

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

Untuk melihat apakah panggilan saat ini adalah panggilan masuk atau keluar, periksa callDirection properti:

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

Untuk melihat apakah mikrofon saat ini dibisukan, periksa muted properti:

boolean muted = call.isMuted();

Untuk memeriksa aliran video aktif, periksa localVideoStreams koleksi:

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

Mematikan suara dan menyalakan suara

Untuk mematikan atau menyalakan suara titik akhir lokal, Anda dapat menggunakan API asinkron mute dan unmute:

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

Mematikan suara peserta lain

Catatan

API ini disediakan sebagai pratinjau publik untuk pengembang dan dapat berubah berdasarkan umpan balik yang kami terima. Untuk menggunakan API ini, gunakan rilis 'beta' Azure Communication Services Memanggil Android SDK versi 2.6.0-beta.5 atau yang lebih tinggi.

Untuk mematikan suara semua peserta lain dalam panggilan, gunakan muteAllRemoteParticipants API pada panggilan.

call.muteAllRemoteParticipants();

Untuk membisukan peserta jarak jauh tertentu, gunakan mute API pada peserta jarak jauh tertentu.

remoteParticipant.mute();

Mengubah volume panggilan

Saat Anda sedang menelepon, tombol volume perangkat keras di telepon akan memungkinkan pengguna untuk mengubah volume panggilan. Ini dilakukan dengan menggunakan metode setVolumeControlStream dengan jenis aliran AudioManager.STREAM_VOICE_CALL pada Aktivitas tempat panggilan dilakukan. Hal ini memungkinkan tombol volume perangkat keras untuk mengubah volume panggilan (dilambangkan dengan ikon telepon atau sesuatu yang serupa pada slider volume), mencegah untuk mengubah volume untuk profil suara lainnya, seperti alarm, media atau volume lebar sistem. Untuk informasi selengkapnya, Anda dapat memeriksa Menangani perubahan pada keluaran audio | Pengembang Android.

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

Manajemen peserta jarak jauh

Semua peserta jarak jauh diwakili RemoteParticipant jenis dan tersedia melalui remoteParticipants koleksi pada instans panggilan.

Mencantumkan peserta dalam panggilan

remoteParticipants Koleksi mengembalikan daftar peserta jarak jauh dalam panggilan tertentu:

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

Menambahkan peserta ke panggilan

Untuk menambahkan peserta ke panggilan (baik pengguna atau nomor telepon) Anda dapat memanggil addParticipant. Tindakan ini akan secara sinkron mengembalikan instans peserta jarak jauh.

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

Hapus peserta dari panggilan

Untuk menghapus peserta dari panggilan (pengguna atau nomor telepon), Anda bisa memanggil removeParticipant. Tindakan ini akan diselesaikan secara asinkron setelah peserta dihapus dari panggilan. Peserta juga akan dihapus dari koleksi remoteParticipants.

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

Properti peserta jarak jauh

Setiap peserta jarak jauh yang diberikan memiliki set properti dan koleksi yang terkait dengannya:

  • Dapatkan pengidentifikasi untuk peserta jarak jauh ini. Identitas adalah salah satu jenis 'Pengidentifikasi'

    CommunicationIdentifier participantIdentifier = remoteParticipant.getIdentifier();
    
  • Dapatkan status peserta jarak jauh ini.

    ParticipantState state = remoteParticipant.getState();
    

Status bisa menjadi salah satu dari

  • 'IDLE' - status awal

  • 'EARLY_MEDIA' - pengumuman diputar sebelum peserta tersambung ke panggilan

  • 'RINGING' - panggilan peserta berdering

  • 'CONNECTING' - status transisi saat peserta tersambung ke panggilan

  • 'CONNECTED' - peserta tersambung ke panggilan

  • 'HOLD' - peserta ditangguhkan

  • 'IN_LOBBY' - peserta menunggu di lobi untuk diterima. Saat ini hanya digunakan dalam skenario interop Teams

  • 'DISCONNECTED' - status akhir - peserta terputus dari panggilan

  • Untuk mengetahui alasan peserta meninggalkan panggilan, periksa callEndReason properti:

    CallEndReason callEndReason = remoteParticipant.getCallEndReason();
    
  • Untuk memeriksa apakah peserta jarak jauh ini dibisukan atau tidak, periksa isMuted properti:

    boolean isParticipantMuted = remoteParticipant.isMuted();
    
  • Untuk memeriksa apakah peserta jarak jauh ini berbicara atau tidak, periksa isSpeaking properti:

    boolean isParticipantSpeaking = remoteParticipant.isSpeaking();
    
  • Untuk memeriksa semua aliran video yang dikirim peserta tertentu dalam panggilan ini, periksa videoStreams koleksi:

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

Menggunakan Layanan Latar Depan

Jika Anda ingin menjalankan tugas yang dapat dilihat pengguna meski saat aplikasi Anda berjalan di latar belakang, Anda dapat menggunakan Layanan Latar Depan.

Misalnya, dengan Layanan Latar Depan, Anda dapat mempertahankan pemberitahuan yang dapat dilihat pengguna saat aplikasi memiliki panggilan aktif. Dengan demikian, meski pengguna membuka layar utama atau menghapus aplikasi dari layar baru-baru ini, panggilan akan tetap aktif.

Jika Anda tidak menggunakan Layanan Latar Depan saat dalam panggilan, membuka layar utama dapat menjaga panggilan tetap aktif, tetapi menghapus aplikasi dari layar baru-baru ini dapat menghentikan panggilan jika OS Android menghentikan proses aplikasi Anda.

Anda harus memulai Layanan Latar Depan saat memulai/bergabung ke panggilan, misalnya:

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

Dan menghentikan Layanan Latar Depan saat Anda menutup panggilan atau status panggilan Terputus, misalnya:

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

Catatan tentang penggunaan Layanan Latar Depan

Perhatikan bahwa skenario seperti menghentikan Layanan Latar Depan yang sudah berjalan saat aplikasi dihapus dari daftar baru-baru ini, akan menghapus pemberitahuan yang dapat dilihat pengguna dan OS Android dapat menjaga proses aplikasi tetapi aktif Anda selama periode tambahan, yang berarti bahwa panggilan masih dapat aktif selama periode tersebut.

Jika aplikasi Anda menghentikan Layanan Latar Depan pada metode layanan onTaskRemoved misalnya, aplikasi Anda dapat memulai/menghentikan audio dan video sesuai dengan Siklus Hidup Aktivitas seperti menghentikan audio dan video saat aktivitas Anda dihentikan dengan penggantian metode onDestroy.

Siapkan sistem Anda

Buat proyek Xcode

Di Xcode, buat proyek iOS baru dan pilih templat Aplikasi Tampilan Tunggal. Mulai cepat ini menggunakan kerangka kerja SwiftUI, jadi Anda harus mengatur Bahasa ke Swift dan mengatur Antarmuka ke SwiftUI.

Anda tidak akan membuat pengujian selama mulai cepat ini. Jangan ragu untuk menghapus kotak centang Sertakan Pengujian.

Cuplikan layar yang memperlihatkan jendela untuk membuat proyek dalam Xcode.

Pasang paket dan dependensi dengan menggunakan CocoaPods

  1. Buat Podfile untuk aplikasi Anda, seperti contoh ini:

    platform :ios, '13.0'
    use_frameworks!
    target 'AzureCommunicationCallingSample' do
        pod 'AzureCommunicationCalling', '~> 1.0.0'
    end
    
  2. Jalankan pod install.

  3. Buka .xcworkspace dengan menggunakan Xcode.

Minta akses ke mikrofon

Untuk mengakses mikrofon perangkat, Anda perlu memperbarui daftar properti informasi aplikasi dengan menggunakan NSMicrophoneUsageDescription. Anda mengatur nilai terkait ke string yang akan disertakan dalam dialog yang digunakan sistem untuk meminta akses dari pengguna.

Klik kanan entri Info.plist dari pohon proyek, lalu pilih Buka Sebagai>Kode Sumber. Tambahkan baris berikut ke bagian <dict> tingkat atas, lalu simpan file.

<key>NSMicrophoneUsageDescription</key>
<string>Need microphone access for VOIP calling.</string>

Menyiapkan kerangka kerja aplikasi

Buka file ContentView.swift proyek Anda. import Tambahkan deklarasi ke bagian atas file untuk mengimpor AzureCommunicationCalling pustaka. Selain itu, impor AVFoundation. Anda akan memerlukannya untuk permintaan izin audio dalam kode.

import AzureCommunicationCalling
import AVFoundation

Inisialisasi CallAgent

Untuk membuat CallAgent instans dari CallClient, Anda harus menggunakan callClient.createCallAgent metode yang secara asinkron mengembalikan CallAgent objek setelah diinisialisasi.

Untuk membuat klien panggilan, berikan CommunicationTokenCredential objek:

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

Teruskan CommunicationTokenCredential objek yang Anda buat ke CallClient, dan atur nama tampilan:

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

Catatan

Ketika aplikasi menerapkan delegasi peristiwa, aplikasi harus memiliki referensi yang kuat ke objek yang memerlukan langganan peristiwa. Misalnya, ketika RemoteParticipant objek dikembalikan pada pemanggilan call.addParticipant metode dan aplikasi menetapkan delegasi untuk mendengarkan RemoteParticipantDelegate, aplikasi harus memegang referensi yang kuat ke RemoteParticipant objek. Jika tidak, jika objek ini dikumpulkan, delegasi akan melemparkan pengecualian fatal ketika Calling SDK mencoba memanggil objek.

Melakukan panggilan keluar

Untuk membuat dan memulai panggilan, Anda perlu memanggil salah satu API CallAgent dan memberikan identitas Azure Communication Services pengguna yang telah Anda sediakan dengan menggunakan Communication Services Management SDK.

Pembuatan dan permulaan panggilan bersifat sinkron. Anda akan menerima instans panggilan yang memungkinkan Anda berlangganan semua peristiwa di panggilan.

Lakukan panggilan 1:1 ke pengguna atau panggilan 1:n dengan pengguna dan PSTN

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

Melakukan panggilan 1:n dengan pengguna dan PSTN

Catatan

Silakan periksa detail penawaran panggilan PSTN. Untuk akses program pratinjau, berlaku untuk program pengadopsi awal.

Untuk melakukan panggilan ke PSTN, Anda harus menentukan nomor telepon yang diperoleh dengan Azure Communication Services.

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

Bergabung dengan panggilan ruang

Untuk bergabung dalam room panggilan, tentukan roomId properti sebagai room pengidentifikasi. Untuk bergabung dengan panggilan, gunakan join metode dan teruskan 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)
    }
}

A room menawarkan pengembang aplikasi kontrol yang lebih baik atas siapa yang dapat bergabung dengan panggilan, ketika mereka bertemu dan bagaimana mereka berkolaborasi. Untuk mempelajari selengkapnya tentang rooms, Anda dapat membaca dokumentasi konseptual atau mengikuti panduan mulai cepat.

Bergabunglah dengan panggilan grup

Untuk bergabung dalam panggilan, Anda perlu menghubungi salah satu API diCallAgent.

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

Berlangganan panggilan masuk

Berlangganan ke peristiwa panggilan masuk.

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
    }
}

Menerima panggilan masuk

Untuk menerima panggilan, hubungi accept metode pada IncomingCall objek.

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

Melakukan operasi selama panggilan

Anda dapat melakukan berbagai operasi selama panggilan untuk mengelola pengaturan yang terkait dengan video dan audio.

Mematikan suara dan menyalakan suara

Untuk mematikan atau menyalakan suara titik akhir lokal, Anda dapat menggunakan mute dan unmute API asinkron.

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

Gunakan kode berikut untuk menyalakan suara titik akhir lokal secara asinkron.

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

Mematikan suara peserta lain

Catatan

API ini disediakan sebagai pratinjau publik untuk pengembang dan dapat berubah berdasarkan umpan balik yang kami terima. Untuk menggunakan API ini, gunakan rilis 'beta' Dari Azure Communication Services Calling iOS SDK versi 2.7.0-beta.3 atau yang lebih tinggi.

Untuk mematikan suara semua peserta lain dalam panggilan, gunakan muteAllRemoteParticipants API pada panggilan.

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

Untuk membisukan peserta jarak jauh tertentu, gunakan mute API pada peserta jarak jauh tertentu.

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

Kelola peserta jarak jauh

Semua peserta jarak jauh diwakili oleh RemoteParticipant jenis dan tersedia melalui remoteParticipants koleksi pada instans panggilan.

Mencantumkan peserta dalam panggilan

call.remoteParticipants

Menambahkan peserta ke panggilan

Untuk menambahkan peserta ke panggilan (baik pengguna atau nomor telepon) Anda dapat memanggil addParticipant. Tindakan ini akan secara sinkron mengembalikan instans peserta jarak jauh.

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

Hapus peserta dari panggilan

Untuk menghapus peserta dari panggilan (pengguna atau nomor telepon), Anda bisa memanggil removeParticipant API. Ini akan menyelesaikan secara asinkron.

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

Dapatkan properti peserta jarak jauh

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

Siapkan sistem Anda

Membuat proyek Visual Studio

Untuk aplikasi UWP, di Visual Studio 2022, buat proyek Aplikasi Kosong (Universal Windows) baru. Setelah Anda memasukkan nama proyek, jangan ragu untuk memilih Windows SDK apa pun yang lebih baru dari 10.0.17763.0.

Untuk aplikasi WinUI 3, buat proyek baru dengan templat Aplikasi Kosong, Dipaketkan (WinUI 3 di Desktop) untuk menyiapkan aplikasi WinUI 3 satu halaman. SDK Aplikasi Windows versi 1.3 atau yang lebih baru diperlukan.

Instal paket dan dependensi dengan menggunakan NuGet Package Manager

API dan pustaka SDK Panggilan tersedia untuk umum melalui paket NuGet.

Langkah-langkah berikut ini mencontohkan cara menemukan, mengunduh, dan menginstal paket NuGet SDK Panggilan:

  1. Buka Manajer Paket NuGet dengan memilih Alat>Pengelola>Paket NuGet Kelola Paket NuGet untuk Solusi.
  2. Pilih Telusuri, lalu masukkan Azure.Communication.Calling.WindowsClient di kotak pencarian.
  3. Pastikan bahwa kotak centang Sertakan prarilis dipilih.
  4. Azure.Communication.Calling.WindowsClient Pilih paket, lalu pilih Azure.Communication.Calling.WindowsClient1.4.0-beta.1 atau versi yang lebih baru.
  5. Pilih kotak centang yang sesuai dengan proyek Communication Services di tab sisi kanan.
  6. Pilih tombol Instal.

Minta akses ke mikrofon

Aplikasi ini memerlukan akses ke mikrofon agar berjalan dengan benar. Di aplikasi UWP, kemampuan mikrofon harus dinyatakan dalam file manifes aplikasi.

Langkah-langkah berikut mencontohkan cara mencapainya.

  1. Di panel Solution Explorer, klik dua kali pada file dengan ekstensi .appxmanifest.
  2. Klik tab Capabilities.
  3. Pilih kotak centang Microphone dari daftar kapabilitas.

Buat tombol UI untuk membuat dan menutup panggilan

Aplikasi sampel sederhana ini berisi dua tombol. Satu untuk membuat panggilan dan satu lagi untuk menutup panggilan. Langkah-langkah berikut menunjukkan contoh cara menambahkan tombol ini ke aplikasi.

  1. Di panel Solution Explorer , klik dua kali pada file bernama MainPage.xaml untuk UWP, atau MainWindows.xaml untuk WinUI 3.
  2. Di panel tengah, cari kode XMAL di bawah pratinjau UI.
  3. Ubah kode XAML dengan kutipan berikut:
<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>

Menyiapkan aplikasi dengan Calling SDK API

Calling SDK API berada di dua namespace yang berbeda. Langkah-langkah berikut memberikan informasi untuk pengompilasi C# tentang namespace layanan ini yang memungkinkan Intellisense Visual Studio membantu pengembangan kode.

  1. Di panel Solution Explorer , klik panah di sisi kiri file bernama MainPage.xaml untuk UWP, atau MainWindows.xaml untuk WinUI 3.
  2. Klik dua kali pada file bernama MainPage.xaml.cs atau MainWindows.xaml.cs.
  3. Tambahkan perintah berikut di bagian bawah pernyataan using saat ini.
using Azure.Communication.Calling.WindowsClient;

Simpan MainPage.xaml.cs atau MainWindows.xaml.cs buka. Langkah-langkah berikutnya akan menambahkan lebih banyak kode ke dalamnya.

Mengizinkan interaksi aplikasi

Tombol UI yang sebelumnya ditambahkan perlu dioperasikan di atas CommunicationCall yang ditempatkan. Ini berarti bahwa CommunicationCall anggota data harus ditambahkan ke MainPage kelas atau MainWindow . Selain itu, untuk memungkinkan operasi asinkron yang membuat CallAgent berhasil, data anggota CallAgent juga harus ditambahkan ke kelas yang sama.

Tambahkan anggota data berikut ke MainPage kelas pr MainWindow :

CallAgent callAgent;
CommunicationCall call;

Membuat pengatur tombol

Sebelumnya, dua tombol UI ditambahkan ke kode XAML. Kode berikut menambahkan pengatur untuk dieksekusi saat pengguna memilih tombol. Kode berikut harus ditambahkan setelah anggota data dari bagian sebelumnya.

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

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

Model objek

Kelas dan antarmuka berikut menangani beberapa fitur utama dari pustaka klien Azure Communication Services Calling untuk UWP.

Nama Deskripsi
CallClient CallClient adalah titik masuk utama ke pustaka klien Panggilan.
CallAgent CallAgent digunakan untuk memulai dan menggabungkan panggilan.
CommunicationCall CommunicationCall digunakan untuk mengelola panggilan yang ditempatkan atau digabungkan.
CommunicationTokenCredential CommunicationTokenCredential digunakan sebagai kredensial token untuk membuat instans CallAgent.
CallAgentOptions berisi CallAgentOptions informasi untuk mengidentifikasi pemanggil.
HangupOptions Menginformasikan HangupOptions apakah panggilan harus dihentikan kepada semua pesertanya.

Menginisialisasi CallAgent

Untuk membuat CallAgent instans dari CallClient, Anda harus menggunakan CallClient.CreateCallAgentAsync metode yang secara asinkron mengembalikan CallAgent objek setelah diinisialisasi.

Untuk membuat CallAgent, Anda harus melewati objek CallTokenCredential dan objek CallAgentOptions. Perlu diingat bahwa CallTokenCredential melempar jika token cacat dilewati.

Kode berikut harus ditambahkan di dalam dan fungsi pembantu untuk dipanggil dalam inisialisasi aplikasi.

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> Ubah dengan token kredensial yang valid untuk sumber daya Anda. Lihat dokumentasi token akses pengguna jika token info masuk harus memiliki sumber.

Buat CallAgent dan lakukan panggilan

Objek yang diperlukan untuk membuat CallAgent sekarang sudah siap. Saatnya membuat dan melakukan panggilan secara CallAgent asinkron.

Kode berikut harus ditambahkan setelah menangani pengecualian dari langkah sebelumnya.

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;

Jangan ragu untuk digunakan 8:echo123 untuk berbicara dengan bot echo Azure Communication Services.

Mematikan suara dan menyalakan suara

Untuk mematikan atau menyalakan suara audio keluar, Anda dapat menggunakan MuteOutgoingAudioAsync API asinkron dan UnmuteOutgoingAudioAsync :

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

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

Mematikan suara peserta lain

Catatan

API ini disediakan sebagai pratinjau publik untuk pengembang dan dapat berubah berdasarkan umpan balik yang kami terima. Untuk menggunakan API ini, gunakan rilis 'beta' Azure Communication Services Memanggil Windows SDK versi 1.4.0-beta.1 atau yang lebih tinggi.

Untuk mematikan suara semua peserta lain atau mematikan suara peserta tertentu, Anda dapat menggunakan API MuteAllRemoteParticipantsAsync asinkron pada panggilan dan MuteAsync pada peserta jarak jauh:

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

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

Mengakhiri panggilan

Setelah panggilan dilakukan, metode HangupAsync objek CommunicationCall harus digunakan untuk menutup panggilan.

Instans HangupOptions juga harus digunakan untuk menginformasikan apakah panggilan harus diakhiri kepada semua pesertanya.

Kode berikut harus ditambahkan di dalam HangupButton_Click.

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

Menjalankan kode

Pastikan Visual Studio membuat aplikasi untuk x64, x86 atau ARM64, lalu tekan F5 untuk mulai menjalankan aplikasi. Setelah itu, klik tombol Call untuk melakukan panggilan ke penerima panggilan yang ditentukan.

Perlu diingat bahwa pertama kali aplikasi berjalan, sistem meminta pengguna untuk memberikan akses ke mikrofon.

Langkah berikutnya