Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Artikel ini menjelaskan cara mengelola panggilan menggunakan Azure Communication Services Calling SDK. Topik mencakup cara melakukan panggilan, mengelola peserta, dan mengelola properti.
Prasyarat
- Akun Azure dengan langganan aktif. Buat akun secara gratis.
- Sumber daya Layanan Komunikasi yang disebarkan. Buat sumber daya Communication Services.
-
User Access Tokenuntuk mengaktifkan klien panggilan. Untuk informasi selengkapnya tentang cara mendapatkanUser Access Token. - Opsional: Selesaikan memulai dengan menambahkan panggilan ke aplikasi Anda.
Dukungan
Tabel berikut mendefinisikan dukungan untuk ruang breakout di Layanan Komunikasi Azure.
Identitas dan jenis panggilan
Tabel berikut ini memperlihatkan dukungan fitur untuk jenis panggilan dan identitas tertentu.
| Identitas | Pertemuan Teams | Ruang | Panggilan 1:1 | Panggilan grup | Panggilan satu-satu interoperabilitas Teams | Panggilan interop Grup Teams |
|---|---|---|---|---|---|---|
| Pengguna Communication Services | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Pengguna Microsoft 365 | ✔️ | ✔️ | ✔️ |
Operasi
Tabel berikut ini memperlihatkan dukungan untuk API individual di SDK Panggilan yang terkait dengan jenis identitas individual.
| Operasi | Pengguna Communication Services | Pengguna Microsoft 365 |
|---|---|---|
| Memulai panggilan ke pengguna Communication Services | ✔️ | |
| Memulai panggilan ke pengguna Microsoft 365 | ✔️ | ✔️ |
| Memulai panggilan ke nomor telepon | ✔️ | ✔️ |
| Bergabung dengan ruang | ✔️ | |
| Bergabung dalam rapat Microsoft Teams | ✔️ | ✔️ |
| Bergabung dalam panggilan berdasarkan ID grup | ✔️ | |
| Menerima atau menolak panggilan masuk | ✔️ | ✔️ |
| Tangguhkan dan lanjutkan panggilan | ✔️ | ✔️ |
| Mengumpulkan peserta | ✔️ | ✔️ |
| Menambahkan pengguna Communication Services | ✔️ | |
| Menghapus pengguna Communication Services | ✔️ | ✔️ |
| Menambahkan atau menghapus pengguna Microsoft 365 | ✔️ | ✔️ |
| Menambahkan atau menghapus nomor telepon | ✔️ | ✔️ |
| Mematikan atau menyalakan suara peserta jarak jauh | ✔️ [1] | ✔️ [1] |
| Tutup telepon | ✔️ | ✔️ |
| Mengakhiri panggilan untuk semua orang | ✔️ [2] | ✔️ |
API hanya didukung dalam panggilan kelompok, ruang obrolan, dan rapat Teams. [2] API tidak didukung di kamar.
SDK
Tabel berikut ini memperlihatkan dukungan untuk fitur di SDK Azure Communication Services individual.
| Status dukungan | Web | Antarmuka Pengguna Web | Ios | Antarmuka pengguna iOS | Android | Antarmuka Pengguna (User Interface) Android | Windows |
|---|---|---|---|---|---|---|---|
| Ini Didukung | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Pasang SDK
Gunakan perintah npm install untuk menginstal Azure Communication Services Common dan Calling SDK 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.
Dengan CallClient instans, Anda dapat membuat instans CallAgent dengan memanggil createCallAgent. Metode ini secara asinkron mengembalikan objek instans CallAgent.
Metode createCallAgent menggunakan CommunicationTokenCredential sebagai argumen. Itu 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()
Mengelola konektivitas SDK ke infrastruktur Microsoft
Call Agent Instans ini membantu Anda mengelola panggilan (untuk bergabung atau memulai panggilan). Untuk bekerja, SDK panggilan Anda perlu tersambung ke infrastruktur Microsoft untuk mendapatkan pemberitahuan panggilan masuk dan mengoordinasikan detail panggilan lainnya. Anda Call Agent memiliki dua kemungkinan status:
Tersambung - Nilai Call AgentConnected connectionStatue berarti SDK klien terhubung dan mampu menerima pemberitahuan dari infrastruktur Microsoft.
Terputus - Nilai status sambungan yang menunjukkan ada masalah yang mencegah SDK terhubung dengan benar.
Call Agent harus dibuat ulang.
-
invalidToken: Jika sebuah token kedaluwarsa atau instance tidak valid,Call Agentakan terputus dengan kesalahan ini. -
connectionIssue: Jika ada masalah dengan klien yang terhubung ke infrastruktur Microsoft, setelah banyak percobaan ulangCall Agentmengekspos kesalahanconnectionIssue.
Anda dapat memeriksa apakah lokal Call Agent Anda tersambung ke infrastruktur Microsoft dengan memeriksa nilai properti connectionState saat ini. Selama panggilan aktif, Anda dapat mendengarkan event connectionStateChanged untuk menentukan apakah Call Agent berubah dari Tersambung ke Terputus.
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);
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, gunakan metode startCall pada callAgent dan teruskan CommunicationUserIdentifier sebagai parameter 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 berikan parameter 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
Lihat detail penawaran panggilan PSTN. Untuk akses program pratinjau, daftar pada 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 dalam panggilan grup
Untuk bergabung dalam panggilan room, Anda dapat menginisiasi sebuah objek konteks dengan properti roomId sebagai pengidentifikasi room. Untuk bergabung dengan panggilan, gunakan metode join dan berikan instance 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 informasi selengkapnya tentang ruang, lihat Rooms API untuk rapat terstruktur dan Bergabung dalam panggilan dalam ruang.
Bergabunglah pada panggilan grup
Catatan
Parameternya groupId adalah metadata sistem, yang 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 yang sudah 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 contoh incomingCall yang dapat Anda terima atau tolak.
Azure Communication Calling SDK mengeluarkan cameraStartFailed: true diagnostik panggilan jika kamera tidak tersedia saat memulai, menerima, atau bergabung dengan panggilan dengan video aktif. Dalam hal ini, panggilan dimulai dengan video dimatikan. Kamera mungkin tidak tersedia karena sedang digunakan oleh proses lain atau dinonaktifkan dalam sistem operasi.
Tangguhkan dan lanjutkan panggilan
Catatan
Pada saat tertentu, hanya boleh ada satu (1) panggilan aktif, dalam Connected status, dengan media aktif. Semua panggilan lain harus ditangguhkan oleh pengguna, atau secara terprogram oleh aplikasi. Skenario ini umum dalam skenario seperti pusat kontak, di mana pengguna mungkin perlu menangani beberapa panggilan keluar dan masuk. Dalam hal ini, semua panggilan yang tidak aktif harus ditangguhkan, dan pengguna harus berinteraksi dengan orang lain hanya dalam panggilan aktif
Untuk menahan atau melanjutkan panggilan, gunakan hold API asinkron dan resume :
Untuk menjeda panggilan:
await call.hold();
Ketika hold operasi 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 menghentikan panggilan untuk peserta panggilan lain.
Untuk melanjutkan panggilan, semua pengguna yang memulai penangguhkan harus melanjutkannya.
Untuk melanjutkan panggilan dari penangguhkan:
await call.resume();
resume Ketika operasi diselesaikan, status panggilan kembali diatur ke Connected.
Mematikan dan mengaktifkan suara panggilan
Untuk mematikan atau menyalakan suara titik akhir lokal, gunakan API asinkron mute dan unmute.
//mute local device (microphone / sent audio)
await call.mute();
//unmute local device (microphone / sent audio)
await call.unmute();
Mematikan dan menyalakan audio masuk
Membisukan audio masuk mengatur volume panggilan menjadi 0. Untuk membisukan atau mengaktifkan suara audio masuk, gunakan operasi muteIncomingAudio dan unmuteIncomingAudio yang bersifat asinkron.
//mute local device (speaker)
await call.muteIncomingAudio();
//unmute local device (speaker)
await call.unmuteIncomingAudio();
Saat audio yang masuk diredam, SDK klien peserta tetap menerima audio panggilan dari 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.
Kelola peserta jarak jauh
Semua peserta jarak jauh disertakan dalam RemoteParticipant objek dan dapat diakses melalui remoteParticipants koleksi pada instans panggilan. Objek 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 maupun nomor telepon) ke panggilan, gunakan operasi addParticipant. Sediakan salah satu dari jenis Identifier. Hal ini secara sinkron mengembalikan instans remoteParticipant. Saat peserta berhasil ditambahkan ke panggilan, itu mengaktifkan peristiwa remoteParticipantsUpdated dari panggilan.
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 });
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 menghapus peserta 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: Dapatkan pengidentifikasi untuk peserta jarak jauh. Identitas adalah salah satu dariCommunicationIdentifierjenis:const identifier = remoteParticipant.identifier;Hal ini dapat berupa salah satu dari
CommunicationIdentifierjenis 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 }: objek yang mewakili pengidentifikasi yang tidak cocok dengan jenis pengidentifikasi lainnya
-
state: Memeriksa 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 menjadiDisconnectedsetelah dua menit.
-
callEndReason: Untuk mempelajari alasan peserta meninggalkan panggilan, periksa properticallEndReason:const callEndReason = remoteParticipant.callEndReason; const callEndReasonCode = callEndReason.code // (number) code associated with the reason const callEndReasonSubCode = callEndReason.subCode // (number) subCode associated with the reasonCatatan
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 tanda ini aktif untuk UserC. Dengan kata lain, UserA sama sekali tidak melihat properti callEndReason milik UserC diubah.
isMutedstatus: Untuk mengetahui apakah peserta jarak jauh dibisukan, periksa propertiisMuted. Hal ini mengembalikanBoolean.const isMuted = remoteParticipant.isMuted;isSpeakingstatus: Untuk mengetahui apakah peserta jarak jauh berbicara, periksa propertiisSpeaking. Hal ini mengembalikanBoolean.const isSpeaking = remoteParticipant.isSpeaking;videoStreams: Untuk memeriksa semua aliran video yang dikirim oleh peserta tertentu dalam panggilan ini, periksa koleksivideoStreams. Ini berisiRemoteVideoStreamobjek.const videoStreams = remoteParticipant.videoStreams; // [RemoteVideoStream, ...]displayName: Untuk mendapatkan nama tampilan untuk peserta jarak jauh ini, periksa propertidisplayNameyang akan mengembalikan string.const displayName = remoteParticipant.displayName;endpointDetails: Dapatkan detail semua titik akhir untuk peserta jarak jauh iniconst endpointDetails: EndpointDetails[] = remoteParticipant.endpointDetails;Catatan
Peserta jarak jauh dapat berada dalam panggilan dari banyak titik akhir yang mungkin, dan setiap titik akhir memiliki keunikannya
participantIdsendiri.participantIdberbeda dari ID mentahRemoteParticipant.
Mematikan suara peserta lain
Catatan
Untuk mematikan suara peserta VoIP lainnya, Anda harus menggunakan Azure Communication Services Calling Web SDK versi 1.26.1 GA versi atau yang lebih tinggi. Untuk membisukan endpoint PSTN, Anda harus menggunakan GA 1.33.1 di WebJS (atau yang lebih tinggi).
Catatan
Membisukan orang lain pada panggilan 1:1 tidak didukung.
Untuk mematikan suara semua peserta lain atau mematikan suara peserta tertentu yang tersambung ke panggilan, Anda dapat menggunakan API muteAllRemoteParticipants asinkron pada panggilan dan mute pada peserta jarak jauh. Acara mutedByOthers dari Panggilan dinaikkan saat peserta lokal dibisukan oleh orang lain.
Membisukan titik akhir PSTN menggunakan panggilan WebJS SDK saat ini berada di tahap Rilis Umum dan tersedia di build 1.34.1 1.34.1 dan versi selanjutnya.
//mute all participants except yourself
await call.muteAllRemoteParticipants();
//mute a specific participant
await call.remoteParticipants[0].mute();
Periksa properti panggilan
Dapatkan ID unik (string) untuk sebuah 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 dengan identitas Azure Communication Services ID mentah.
Ambil ID sesi saat 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 remoteParticipants koleksi pada call instans:
const remoteParticipants = call.remoteParticipants;
Mengidentifikasi penelepon dari panggilan masuk:
const callerIdentity = call.callerInfo.identifier;
identifier adalah salah satu dari CommunicationIdentifier jenis.
Dapatkan 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 panggilan sedang berdering untuk peserta jarak jauh. IniIncomingdi 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 aliran media antara endpoint lokal dan peserta jarak jauh. -
RemoteHold: Menunjukkan bahwa peserta jarak jauh panggilan menangguhkan panggilan. Tidak ada aliran media antara endpoint lokal dan peserta jarak jauh. -
InLobby: Menunjukkan bahwa pengguna berada di lobi. -
Disconnecting: Status transisi sebelum panggilan beralih ke statusDisconnected. -
Disconnected: Status panggilan terakhir. Jika koneksi jaringan terputus, statusnya berubah menjadiDisconnectedsetelah dua menit.
Cari tahu mengapa panggilan berakhir dengan memeriksa properti callEndReason:
const callEndReason = call.callEndReason;
const callEndReasonMessage = callEndReason.message // (string) user friendly message
const callEndReasonCode = callEndReason.code // (number) code associated with the reason
const callEndReasonSubCode = callEndReason.subCode // (number) subCode associated with the reason
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 dan berbagi layar yang aktif dengan memeriksa koleksi localVideoStreams.
localVideoStreams Operasi 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;
Tutup telepon
Ada dua cara untuk menutup telepon.
- Pemanggil awal dapat meninggalkan panggilan dan peserta lain tetap dalam panggilan.
- Ketika pemanggil awal pergi, panggilan berakhir untuk semua peserta.
Untuk meninggalkan panggilan, gunakan:
call.hangUp();
Akhiri panggilan untuk semua peserta dengan memberikan HangUpOptions.
Catatan
Operasi ini tidak tersedia di kamar.
call.hangUp( forEveryone: true);
Pasang SDK
Temukan file tingkat build.gradle proyek Anda dan tambahkan mavenCentral() ke daftar repositori di bawah buildscript dan allprojects:
buildscript {
repositories {
...
mavenCentral()
...
}
}
allprojects {
repositories {
...
mavenCentral()
...
}
}
Kemudian, dalam file tingkat build.gradle 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 instance CallAgent, Anda harus memanggil metode createCallAgent pada instance CallClient. Panggilan ini secara asinkron mengembalikan objek instans CallAgent .
Metode ini createCallAgent mengambil CommunicationUserCredential sebagai argumen, yang merangkum token akses.
Untuk mengakses DeviceManager, Anda harus terlebih dahulu membuat instans callAgent. 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 CallAgent.startCall() metode dan menyediakan Identifier penerima atau penerima.
Untuk bergabung dengan panggilan grup, Anda perlu menggunakan metode CallAgent.join() dan menyediakan groupId. ID grup harus dalam format GUID atau UUID.
Pembuatan dan permulaan panggilan bersifat sinkron. Instans panggilan memungkinkan Anda berlangganan 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);
Lakukan panggilan 1:n dengan pengguna dan PSTN
Catatan
Lihat detail penawaran panggilan PSTN. Untuk akses program pratinjau, daftar pada program pengadopsi awal.
Untuk melakukan panggilan 1:n ke pengguna dan nomor jaringan telepon umum yang disambungkan (PSTN), Anda perlu menentukan nomor telepon penerima atau para penerima.
Sumber daya Communication Services Anda harus dikonfigurasi untuk mengaktifkan 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, panggil accept metode 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();
Dapatkan panggilan masuk dengan berlangganan pada peristiwa onIncomingCall di objek callAgent.
// 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 dalam panggilan grup
Gunakan CallAgent dan RoomCallLocator untuk bergabung dengan panggilan ruang dengan menentukan roomId. Metode CallAgent.join 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 informasi selengkapnya tentang ruang, lihat Rooms API untuk rapat terstruktur dan Bergabung dalam panggilan dalam ruang.
Bergabunglah pada panggilan grup
Untuk memulai panggilan grup baru atau bergabung dengan panggilan grup yang sedang berlangsung, Anda perlu memanggil join metode dan meneruskan objek dengan groupId properti . Nilai harus berupa GUID.
Context appContext = this.getApplicationContext();
GroupCallLocator groupCallLocator = new GroupCallLocator("<GUID>");
JoinCallOptions joinCallOptions = new JoinCallOptions();
call = callAgent.join(context, groupCallLocator, joinCallOptions);
Detail panggilan
Dapatkan ID unik untuk Panggilan ini:
String callId = call.getId();
Untuk mempelajari peserta lain dalam panggilan, perhatikan kumpulan remoteParticipant pada contoh call:
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 ditempatkan atau diterima -
RINGING- untuk panggilan keluar - menunjukkan panggilan berdering untuk peserta jarak jauh -
CONNECTED- panggilan tersambung -
LOCAL_HOLD- panggilan ditahan sementara oleh peserta lokal tanpa aliran media antara titik akhir lokal dan peserta jarak jauh -
REMOTE_HOLD- panggilan ditangguhkan oleh peserta jarak jauh tanpa media yang mengalir antara titik akhir lokal dan peserta jarak jauh -
DISCONNECTING- status transisi sebelum panggilan masuk keDisconnectedstatus -
DISCONNECTED- status panggilan akhir -
IN_LOBBY- di ruang tunggu untuk rapat interoperabilitas Teams
Untuk mengetahui mengapa panggilan diakhiri, periksa properti callEndReason. 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 properti muted:
boolean muted = call.isMuted();
Untuk memeriksa aliran video aktif, periksa koleksi localVideoStreams:
List<LocalVideoStream> localVideoStreams = call.getLocalVideoStreams();
Bisu dan tidak bisu
Untuk menonaktifkan atau mengaktifkan titik akhir lokal, Anda dapat menggunakan mute dan unmute API asinkron:
Context appContext = this.getApplicationContext();
call.mute(appContext).get();
call.unmute(appContext).get();
Mengubah volume panggilan
Saat peserta sedang dalam panggilan, kunci volume perangkat keras di telepon harus memungkinkan pengguna untuk mengubah volume panggilan.
Gunakan metode setVolumeControlStream dengan jenis aliran AudioManager.STREAM_VOICE_CALL pada Aktivitas tempat panggilan terjadi.
Metode ini memungkinkan kunci volume perangkat keras untuk mengubah volume panggilan, yang ditandai oleh ikon telepon atau sesuatu yang mirip pada slider volume. Ini juga mencegah perubahan volume oleh profil suara lain, seperti alarm, media, atau volume sistem secara menyeluruh. Untuk informasi selengkapnya, lihat Menangani perubahan dalam output audio | Pengembang Android.
@Override
protected void onCreate(Bundle savedInstanceState) {
...
setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
}
Manajemen peserta jarak jauh
Semua peserta jarak jauh memiliki tipe RemoteParticipant dan tersedia dalam koleksi remoteParticipants pada instance panggilan.
Mencantumkan peserta dalam panggilan
Koleksi remoteParticipants mengembalikan daftar peserta jarak jauh dalam panggilan tertentu.
List<RemoteParticipant> remoteParticipants = call.getRemoteParticipants(); // [remoteParticipant, remoteParticipant....]
Menambahkan peserta ke panggilan
Untuk menambahkan peserta ke panggilan (entah pengguna ataupun nomor telepon), Anda dapat memanggil operasi addParticipant.
Operasi ini mengembalikan contoh peserta jarak jauh secara sinkron.
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 (baik pengguna atau nomor telepon), Anda dapat melakukan operasi removeParticipant.
Operasi ini diselesaikan secara asinkron setelah peserta dihapus dari panggilan.
Peserta juga 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 partisipan jarak jauh
Setiap peserta jarak jauh tertentu memiliki sekumpulan properti dan koleksi terkait:
- Dapatkan pengidentifikasi untuk peserta jarak jauh ini.
Identitas adalah salah satu dari Identifier jenis:
CommunicationIdentifier participantIdentifier = remoteParticipant.getIdentifier();
Dapatkan status peserta jarak jauh ini.
ParticipantState state = remoteParticipant.getState();
Status dapat berupa salah satu dari:
IDLE- status awalEARLY_MEDIA- Pengumuman diputar sebelum peserta terhubung ke panggilanRINGING- panggilan peserta berderingCONNECTING- status transisi saat peserta tersambung ke panggilanCONNECTED- peserta terhubung ke panggilanHOLD- peserta sedang ditahanIN_LOBBY- peserta menunggu di lobi untuk dirawat. Saat ini digunakan hanya dalam skenario interop Teams.DISCONNECTED- status akhir - peserta terputus dari panggilanUntuk mengetahui mengapa peserta meninggalkan panggilan, periksa properti
callEndReason.CallEndReason callEndReason = remoteParticipant.getCallEndReason();Untuk memeriksa apakah peserta jarak jauh ini dibisukan atau tidak, periksa properti
isMuted:boolean isParticipantMuted = remoteParticipant.isMuted();Untuk memeriksa apakah peserta jarak jauh ini berbicara atau tidak, periksa
isSpeakingproperti:boolean isParticipantSpeaking = remoteParticipant.isSpeaking();Untuk memeriksa semua aliran video yang dikirim oleh peserta yang ditentukan dalam panggilan ini, periksa kumpulan
videoStreams:List<RemoteVideoStream> videoStreams = remoteParticipant.getVideoStreams(); // [RemoteVideoStream, RemoteVideoStream, ...]
Mematikan suara peserta lain
Catatan
Gunakan Azure Communication Services Calling SDK Android versi 2.11.0 atau yang lebih tinggi.
Ketika peserta PSTN dibisukan, mereka menerima pengumuman bahwa mereka dibisukan dan dapat menekan kombinasi tombol (seperti *6) untuk membuka suara mereka sendiri. Ketika mereka menekan *6, mereka dinyalakan suaranya.
Untuk mematikan suara semua peserta lain dalam panggilan, gunakan muteAllRemoteParticipants operasi API.
call.muteAllRemoteParticipants();
Untuk membisukan peserta jarak jauh tertentu, gunakan mute operasi API pada peserta jarak jauh tertentu.
remoteParticipant.mute();
Untuk memberi tahu peserta lokal bahwa mereka dibisukan oleh orang lain, berlangganan acara.onMutedByOthers
Menggunakan Layanan Latar Depan
Jika Anda ingin menjalankan tugas yang terlihat pengguna bahkan ketika aplikasi Anda berada di latar belakang, Anda dapat menggunakan Layanan Latar Depan.
Gunakan Foreground Services, misalnya, untuk memberi pengguna pemberitahuan yang terlihat saat aplikasi Anda memiliki panggilan aktif. Dengan cara ini, bahkan jika pengguna pergi ke homescreen atau menghapus aplikasi dari layar terbaru, panggilan terus 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 pengguna memulai atau bergabung dalam panggilan, misalnya:
call = callAgent.startCall(context, participants, options);
startService(yourForegroundServiceIntent);
Anda juga harus menghentikan Layanan Latar Depan saat menutup panggilan atau status panggilan Terputus, misalnya:
call.hangUp(new HangUpOptions()).get();
stopService(yourForegroundServiceIntent);
Detail Layanan Latar Depan
Perlu diingat bahwa skenario seperti menghentikan Layanan Latar Depan yang sudah berjalan saat aplikasi dihapus dari daftar terbaru akan menghapus pemberitahuan yang terlihat oleh pengguna. Dalam hal ini OS Android dapat menjaga proses aplikasi Anda tetap hidup selama beberapa periode waktu tambahan, yang berarti bahwa panggilan dapat tetap aktif selama periode ini.
Jika aplikasi Anda menghentikan Layanan Latar Depan pada metode layanan onTaskRemoved , misalnya, aplikasi Anda dapat memulai atau menghentikan audio dan video sesuai dengan Siklus Hidup Aktivitas Anda. Seperti menghentikan audio dan video saat aktivitas Anda dihancurkan dengan penimpaan onDestroy metode.
Siapkan sistem Anda
Ikuti langkah-langkah ini untuk menyiapkan sistem Anda.
Buat proyek Xcode
Di Xcode, buat proyek iOS baru dan pilih templat Aplikasi Tampilan Tunggal. Artikel ini menggunakan kerangka kerja SwiftUI, jadi Anda harus mengatur Bahasa ke Swift dan mengatur Antarmuka ke SwiftUI.
Anda tidak akan membuat pengujian di artikel ini. Jangan ragu untuk menghapus centang pada Sertakan Pengujian.
Pasang paket dan dependensi dengan menggunakan CocoaPods
Buat Podfile untuk aplikasi Anda, seperti contoh ini:
platform :ios, '13.0' use_frameworks! target 'AzureCommunicationCallingSample' do pod 'AzureCommunicationCalling', '~> 1.0.0' endJalankan
pod install.Buka
.xcworkspacedengan menggunakan Xcode.
Minta akses ke mikrofon
Untuk mengakses mikrofon perangkat, Anda perlu memperbarui daftar properti informasi aplikasi dengan menggunakan NSMicrophoneUsageDescription. Atur nilai terkait ke string yang 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 proyek ContentView.swift Anda. Tambahkan deklarasi import ke bagian atas file untuk mengimpor pustaka AzureCommunicationCalling. Selain itu, impor AVFoundation. Anda memerlukannya untuk permintaan izin audio dalam kode.
import AzureCommunicationCalling
import AVFoundation
Inisialisasi CallAgent
Untuk membuat instance CallAgent dari CallClient, Anda harus menggunakan metode callClient.createCallAgent yang secara asinkron mengembalikan object CallAgent 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 sebuah aplikasi mengimplementasikan delegasi peristiwa, aplikasi tersebut harus memegang referensi yang kuat ke objek yang memerlukan langganan peristiwa. Misalnya, saat Anda memanggil call.addParticipant metode dan mengembalikan RemoteParticipant objek. Kemudian aplikasi mengatur delegasi untuk mendengarkan RemoteParticipantDelegate dan aplikasi harus memegang referensi yang kuat ke objek RemoteParticipant. Jika tidak, jika objek ini dikumpulkan, delegasi akan melempar pengecualian fatal ketika Calling SDK mencoba memanggil objek.
Melakukan panggilan ke luar
Untuk membuat dan memulai panggilan, Anda perlu memanggil salah satu API di CallAgent dan memberikan identitas Communication Services pengguna yang telah disediakan dengan menggunakan Communication Services Management SDK.
Pembuatan dan permulaan panggilan bersifat sinkron. Anda menerima instance panggilan yang memungkinkan Anda berlangganan semua peristiwa dalam 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")
}
}
Lakukan panggilan 1:n dengan pengguna dan PSTN
Catatan
Lihat detail penawaran panggilan PSTN. Untuk akses program pratinjau, daftar pada program pengadopsi awal.
Untuk melakukan panggilan 1:n ke pengguna dan jaringan telepon yang dialihkan publik (PSTN), Anda perlu menentukan nomor telepon yang diperoleh dengan 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 dalam panggilan grup
Untuk bergabung dalam room panggilan, tentukan roomId properti sebagai room pengidentifikasi. Untuk bergabung dengan panggilan, gunakan metode join dan berikan 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 informasi selengkapnya tentang ruang, lihat Rooms API untuk rapat terstruktur dan Bergabung dalam panggilan dalam ruang.
Bergabunglah pada 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 acara 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 di tengah panggilan
Anda dapat melakukan operasi selama panggilan untuk mengelola pengaturan yang terkait dengan video dan audio.
Bisu dan tidak bisu
Untuk membisukan atau membunyikan titik akhir lokal, Anda dapat menggunakan API asinkron mute dan unmute.
call!.mute { (error) in
if error == nil {
print("Successfully muted")
} else {
print("Failed to mute")
}
}
Gunakan kode berikut untuk membatalkan pengaturan bisu pada titik akhir lokal secara asinkron.
call!.unmute { (error) in
if error == nil {
print("Successfully un-muted")
} else {
print("Failed to unmute")
}
}
Kelola peserta jarak jauh
Jenis RemoteParticipant mewakili semua peserta jarak jauh. Mereka tersedia melalui remoteParticipants koleksi pada instans panggilan.
Mencantumkan peserta dalam panggilan
call.remoteParticipants
Menambahkan peserta ke panggilan
Untuk menambahkan peserta ke panggilan sebagai pengguna atau nomor telepon, panggil operasi addParticipant. Operasi ini 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 sebagai pengguna atau nomor telepon, panggil operasi removeParticipant. Operasi ini diselesaikan secara asinkron.
call!.remove(participant: remoteParticipantAdded) { (error) in
if (error == nil) {
print("Successfully removed participant")
} else {
print("Failed to remove participant")
}
}
Dapatkan atribut 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, ...]
Mematikan suara peserta lain
Catatan
Gunakan Azure Communication Services Calling iOS SDK versi 2.13.0 atau yang lebih tinggi.
Ketika peserta PSTN dibisukan, mereka menerima pengumuman bahwa mereka dibisukan dan dapat menekan kombinasi tombol (seperti *6) untuk membuka suara mereka sendiri. Ketika mereka menekan *6, mereka tidak dibisukan.
Untuk mematikan suara semua peserta lain dalam panggilan, gunakan muteAllRemoteParticipants operasi pada panggilan.
call!.muteAllRemoteParticipants { (error) in
if error == nil {
print("Successfully muted all remote participants.")
} else {
print("Failed to mute remote participants.")
}
}
Untuk mematikan suara peserta jarak jauh tertentu, gunakan operasi mute pada peserta jarak jauh tersebut.
remoteParticipant.mute { (error) in
if error == nil {
print("Successfully muted participant.")
} else {
print("Failed to mute participant.")
}
}
Untuk memberi tahu peserta lokal bahwa mereka dibisukan oleh orang lain, berlangganan acara.onMutedByOthers
Siapkan sistem Anda
Ikuti langkah-langkah ini untuk menyiapkan sistem Anda.
Membuat proyek Visual Studio
Untuk aplikasi Platform Windows Universal, di Visual Studio 2022, buat proyek baru Aplikasi Kosong (Universal Windows). 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 dengan 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 secara publik melalui paket NuGet.
Untuk menemukan, mengunduh, dan menginstal paket Calling SDK NuGet:
- Buka Pengelola Paket NuGet dengan memilih Alat>Manajer Paket NuGet>Kelola Paket NuGet untuk Solusi.
- Pilih Telusuri, lalu masukkan Azure.Communication.Calling.WindowsClient di kotak pencarian.
- Pastikan bahwa kotak centang Sertakan prarilis dipilih.
- Pilih paket Azure.Communication.Calling.WindowsClient, lalu pilih Azure.Communication.Calling.WindowsClient1.4.0-beta.1 atau versi yang lebih baru.
- Pilih kotak centang yang sesuai dengan proyek Azure Communication Services di panel kanan.
- Pilih Instal.
Menerapkan aplikasi sampel di Visual Studio
Bagian ini menjelaskan cara mengembangkan aplikasi untuk mengelola panggilan yang berfungsi di Visual Studio.
Minta akses ke mikrofon
Aplikasi ini memerlukan akses ke mikrofon. Di aplikasi Universal Windows Platform (UWP), kemampuan mikrofon harus dideklarasikan dalam file manifes aplikasi.
Untuk mengakses mikrofon:
- Di panel
Solution Explorer, klik dua kali pada file dengan ekstensi.appxmanifest. - Klik pada tab
Capabilities. - Pilih kotak centang
Microphonedari daftar kapabilitas.
Buat tombol UI untuk membuat dan menutup panggilan
Aplikasi sampel ini berisi dua tombol. Satu tombol untuk melakukan panggilan dan satu lagi untuk mengakhiri panggilan yang telah dibuat.
Tambahkan dua tombol ke aplikasi.
- Di panel
Solution Explorer, klik dua kali pada file bernamaMainPage.xamluntuk UWP, atauMainWindows.xamluntuk WinUI 3. - Pada panel tengah, cari kode XAML di bawah pratinjau UI.
- 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 API SDK Telepon
Calling SDK API berada di dua namespace yang berbeda.
Langkah-langkah berikut memberi tahu pengkompilasi C# tentang namespace ini, memungkinkan Intellisense Visual Studio untuk membantu pengembangan kode.
- Di panel
Solution Explorer, klik panah di sisi kiri file bernamaMainPage.xamluntuk UWP, atauMainWindows.xamluntuk WinUI 3. - Klik dua kali pada file bernama
MainPage.xaml.csatauMainWindows.xaml.cs. - Tambahkan perintah berikut di bagian bawah pernyataan
usingsaat ini.
using Azure.Communication.Calling.WindowsClient;
Biarkan MainPage.xaml.cs atau MainWindows.xaml.cs terbuka. Langkah berikutnya menambahkan lebih banyak kode.
Mengaktifkan interaksi aplikasi
Tombol UI yang sebelumnya ditambahkan perlu berfungsi di atas CommunicationCall yang sudah dipasang. Ini berarti bahwa anggota data CommunicationCall harus ditambahkan ke kelas MainPage 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 ini harus ditambahkan setelah anggota data pada 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 menginisialisasi CallAgent. |
CallAgentOptions |
CallAgentOptions berisi informasi untuk mengidentifikasi pemanggil. |
HangupOptions |
HangupOptions menginformasikan kepada semua pesertanya apakah panggilan harus dihentikan. |
Menginisialisasi CallAgent
Untuk membuat instans CallAgent dari CallClient, Anda harus menggunakan metode CallClient.CreateCallAgentAsync yang akan secara asinkron mengembalikan objek CallAgent setelah diinisialisasi.
Untuk membuat CallAgent, Anda harus melewati objek CallTokenCredential dan objek CallAgentOptions. Perlu diingat bahwa CallTokenCredential melempar jika token cacat dilewati.
Untuk memanggil selama inisialisasi aplikasi, tambahkan kode berikut di dalam fungsi pembantu.
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);
Mengubah <AUTHENTICATION_TOKEN> dengan token kredensial yang valid untuk sumber daya Anda. Jika Anda perlu sumber token kredensial, lihat token akses pengguna.
Buat CallAgent dan lakukan panggilan
Objek yang Anda butuhkan untuk membuat CallAgent sekarang sudah siap. Saatnya secara asinkron membuat CallAgent dan melakukan panggilan.
Tambahkan kode berikut 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;
Gunakan 8:echo123 untuk berbicara dengan bot echo Azure Communication Services.
Bisu dan tidak bisu
Untuk menonaktifkan atau mengaktifkan audio keluar, gunakan operasi asinkron MuteOutgoingAudioAsync dan UnmuteOutgoingAudioAsync.
// mute outgoing audio
await this.call.MuteOutgoingAudioAsync();
// unmute outgoing audio
await this.call.UnmuteOutgoingAudioAsync();
Mematikan suara peserta lain
Catatan
Gunakan Azure Communication Services Calling SDK Windows versi 1.9.0 atau lebih tinggi.
Ketika peserta PSTN dibisukan, mereka harus menerima pengumuman bahwa mereka telah dibisukan dan bahwa mereka dapat menekan kombinasi tombol tertentu (seperti *6) untuk membuka suara sendiri. Ketika mereka menekan *6, mereka harus bisa berbicara.
Untuk mematikan suara semua peserta lain atau mematikan suara peserta tertentu, gunakan operasi 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();
Untuk memberi tahu peserta lokal bahwa mereka dibisukan oleh orang lain, berlangganan acara.MutedByOthers
Mengakhiri panggilan
Setelah panggilan dilakukan, gunakan metode HangupAsync dari objek CommunicationCall untuk menutup panggilan.
Gunakan instans HangupOptions untuk memberi tahu semua peserta jika panggilan harus dihentikan.
Tambahkan kode berikut 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,x86atauARM64. - Tekan F5 untuk mulai menjalankan aplikasi.
- Setelah aplikasi berjalan, klik tombol Panggil untuk melakukan panggilan ke penerima yang ditentukan.
Pertama kali aplikasi berjalan, sistem meminta pengguna untuk memberikan akses ke mikrofon.