Panduan ini menjelaskan cara mengintegrasikan ARTC SDK ke dalam proyek Android Anda untuk membangun aplikasi audio dan video real-time, yang cocok untuk kasus penggunaan seperti live streaming interaktif dan panggilan video.
Deskripsi fitur
Sebelum memulai, pahami konsep-konsep utama berikut:
ARTC SDK: SDK yang disediakan oleh Alibaba Cloud untuk membantu developer mengimplementasikan interaksi audio dan video real-time secara cepat.
Global Realtime Transport Network (GRTN): Jaringan terdistribusi global yang dirancang khusus untuk media real-time, menjamin latensi ultra-rendah, kualitas tinggi, dan komunikasi yang aman.
Channel: Ruang virtual tempat pengguna bergabung untuk saling berkomunikasi. Semua pengguna dalam channel yang sama dapat berinteraksi secara real-time.
Host: Pengguna yang dapat menerbitkan aliran audio dan video dalam suatu channel serta berlangganan aliran yang diterbitkan oleh host lain.
Viewer: Pengguna yang dapat berlangganan aliran audio dan video dalam suatu channel tetapi tidak dapat menerbitkan alirannya sendiri.
Proses dasar untuk mengimplementasikan interaksi audio dan video real-time:
Panggil
setChannelProfileuntuk mengatur skenario, dan panggiljoinChanneluntuk bergabung ke channel:Skenario panggilan video: Semua pengguna adalah host dan dapat menerbitkan serta berlangganan aliran.
Skenario streaming interaktif: Peran harus diatur menggunakan
setClientRolesebelum bergabung ke channel. Untuk pengguna yang akan menerbitkan aliran, atur perannya menjadi host. Jika pengguna hanya perlu berlangganan aliran, atur perannya menjadi viewer.
Setelah bergabung ke channel, pengguna memiliki perilaku penerbitan dan langganan yang berbeda berdasarkan perannya:
Semua pengguna dapat menerima aliran audio dan video dalam channel tersebut.
Seorang host dapat menerbitkan aliran audio dan video dalam channel.
Jika seorang viewer ingin menerbitkan aliran, panggil metode
setClientRoleuntuk mengubah perannya menjadi host.
Proyek contoh
ARTC SDK menyediakan proyek contoh open-source untuk aplikasi audio dan video real-time.
Persyaratan lingkungan
Sebelum menjalankan proyek contoh, pastikan lingkungan pengembangan Anda memenuhi persyaratan berikut:
Tool pengembangan: Android Studio 2020.3.1 atau versi yang lebih baru.
Perangkat uji: Perangkat uji yang menjalankan Android 5.0 (SDK API Level 21) atau versi yang lebih baru.
CatatanKami merekomendasikan penggunaan perangkat fisik untuk pengujian, karena beberapa emulator mungkin tidak memiliki fungsi yang diperlukan.
Network: Koneksi internet yang stabil.
Application: Dapatkan AppID dan AppKey untuk aplikasi ARTC Anda. Untuk detailnya, lihat Buat aplikasi ARTC.
Buat proyek (opsional)
Bagian ini menjelaskan cara membuat proyek dan menambahkan izin yang diperlukan untuk interaksi audio dan video. Anda dapat melewati bagian ini jika sudah memiliki proyek.
Buka Android Studio dan pilih New Project.
Pilih Phone and Tablet dan pilih templat awal. Contoh ini menggunakan Empty Views Activity.

Konfigurasikan informasi proyek Anda, termasuk nama proyek, nama paket, lokasi penyimpanan, bahasa (Java pada contoh ini), dan bahasa konfigurasi build (Groovy DSL pada contoh ini).

Klik Finish dan tunggu hingga proyek selesai disinkronkan.
Konfigurasi proyek
Langkah 1: Impor SDK
Integrasi otomatis melalui Maven (direkomendasikan)
Buka file
settings.gradledi direktori root proyek Anda dan tambahkan Repositori Maven untuk ARTC SDK ke bidangdependencyResolutionManagement/repositories, seperti pada contoh berikut:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
// Tambahkan Repositori Maven untuk ARTC SDK
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/public' }
}
}Note: Jika Anda menggunakan Android Gradle Plugin versi di bawah 7.1.0, Anda mungkin tidak menemukan bidang yang sesuai di file settings.gradle. Untuk informasi selengkapnya, lihat Android Gradle Plugin 7.1. Dalam kasus ini, gunakan solusi alternatif berikut:
Buka file
app/build.gradledan tambahkan dependensi untuk ARTC SDK kedependencies. Anda dapat memperoleh versi terbaru di Download SDK dan ganti${latest_version}dengan nomor versi spesifik. Versi terbaru yang tersedia adalah 7.9.1.
dependencies {
// Tambahkan dependensi untuk ARTC SDK
// Ganti ${latest_version} dengan nomor versi spesifik.
implementation 'com.aliyun.aio:AliVCSDK_ARTC:${latest_version}'
// Untuk versi 7.4.0 dan di bawahnya, tambahkan dependensi keep
// implementation 'com.aliyun.aio.keep:keep:1.0.1'
} Jika Anda menggunakan Android Gradle Plugin versi 8.1 atau lebih baru, Android Studio merekomendasikan migrasi informasi library dependensi ke version catalog. Untuk informasi selengkapnya, lihat Migrasi dependensi.
Integrasi manual
Unduh file AAR ARTC SDK untuk versi yang Anda butuhkan (
AliVCSDK_ARTC-x.y.z.aar). Versi terbaru yang tersedia adalah 7.9.1.Salin file AAR yang telah diunduh ke direktori proyek Anda, misalnya
app/libs. Buat folder ini jika belum tersedia.Buka file
settings.gradledi direktori root proyek Anda dan tambahkan folder yang berisi file AAR kedependencyResolutionManagement/repositories, seperti pada contoh berikut:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
// Tambahkan direktori relatif tempat ARTC SDK berada
flatDir {
dir 'app/libs'
}
}
}Note: Jika Anda menggunakan Android Gradle Plugin versi di bawah 7.1.0, Anda mungkin tidak menemukan bidang yang sesuai di file settings.gradle. Untuk informasi selengkapnya, lihat Android Gradle Plugin 7.1. Dalam kasus ini, gunakan solusi alternatif berikut:
Buka file build.gradle di direktori root proyek Anda dan tambahkan bidang berikut ke allprojects/repositories:
allprojects {
repositories {
...
// Tambahkan direktori relatif tempat ARTC SDK berada
flatDir {
dir 'app/libs'
}
}
}Buka file
app/build.gradledan tambahkan dependensi untuk file AAR kedependencies. Contoh kode:
// Ganti x.y.z dengan nomor versi spesifik.
implementation(name:'AliVCSDK_ARTC', version: 'x.y.z', ext:'aar')Dependensi yang sesuai akan dibuat di bawah
External Libraries.
Langkah 2: Konfigurasi arsitektur CPU yang didukung
Buka file app/build.gradle dan tentukan arsitektur CPU yang didukung oleh proyek Anda di defaultConfig, seperti pada contoh berikut. Arsitektur yang tersedia meliputi armeabi-v7a, arm64-v8a, x86, dan x86_64.
android {
defaultConfig {
// ...konfigurasi default lainnya
// Mendukung arsitektur armeabi-v7a dan arm64-v8a
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
}
} Langkah 3: Konfigurasi izin
Konfigurasikan izin yang diperlukan oleh aplikasi Anda:
Buka direktori app/src/main, buka file AndroidManifest.xml, dan tambahkan izin yang diperlukan.
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- Minta izin Bluetooth lama pada perangkat lama. -->
<uses-permission
android:name="android.permission.BLUETOOTH"
android:maxSdkVersion="30" />
<uses-permission
android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="30" />
<!-- Hanya diperlukan jika aplikasi Anda berkomunikasi dengan perangkat Bluetooth yang sudah dipasangkan. -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />Note: Untuk Android 6.0 (API level 23) dan versi yang lebih baru, izin runtime perlu diminta secara dinamis. Selain mendeklarasikannya secara statis di file AndroidManifest.xml, Anda juga perlu meminta izin tersebut saat runtime.
Izin runtime meliputi:
Manifest.permission.CAMERA
Manifest.permission.WRITE_EXTERNAL_STORAGE
Manifest.permission.RECORD_AUDIO
Manifest.permission.READ_EXTERNAL_STORAGE
Manifest.permission.READ_PHONE_STATE
Untuk Android 12 (API level 31) dan versi yang lebih baru, izin berikut juga perlu diminta secara dinamis:
Manifest.permission.BLUETOOTH_CONNECT
Deskripsi izin:
Nama izin | Deskripsi | Tujuan | Wajib | Permintaan dinamis |
CAMERA | Izin kamera. | Akses kamera perangkat untuk menangkap aliran video. | Ya | Android 6 dan versi lebih baru |
RECORD_AUDIO | Izin mikrofon. | Akses mikrofon perangkat untuk menangkap aliran audio. | Ya | Android 6 dan versi lebih baru |
INTERNET | Izin jaringan. | Mengirimkan data audio dan video melalui jaringan (misalnya, protokol WebRTC). | Ya | Tidak |
ACCESS_NETWORK_STATE | Mengizinkan aplikasi untuk mendapatkan status jaringan. | Memantau status koneksi jaringan untuk mengoptimalkan kualitas transmisi audio dan video, seperti menyambung ulang saat terputus. | Tidak | Tidak |
ACCESS_WIFI_STATE | Mengizinkan aplikasi untuk mendapatkan status WiFi. | Mendapatkan informasi koneksi WiFi saat ini untuk mengoptimalkan kinerja jaringan. | Tidak | Tidak |
MODIFY_AUDIO_SETTINGS | Mengizinkan aplikasi untuk mengubah konfigurasi audio. | Menyesuaikan volume sistem, mengganti perangkat output audio, dll. | Tidak | Tidak |
BLUETOOTH | Izin Bluetooth (fungsi dasar) | Menghubungkan ke perangkat Bluetooth (seperti headset Bluetooth). | Tidak | Tidak |
BLUETOOTH_CONNECT | Izin koneksi Bluetooth | Berkomunikasi dengan perangkat Bluetooth yang telah dipasangkan, seperti mengirimkan aliran audio. | Tidak | Android 12 dan versi lebih baru |
READ_PHONE_STATE | Mengizinkan aplikasi untuk mengakses informasi terkait status telepon perangkat | Memulai atau menghentikan audio berdasarkan status telepon. | Tidak | Android 6 dan versi lebih baru |
READ_EXTERNAL_STORAGE | Mengizinkan aplikasi untuk membaca file dari penyimpanan eksternal. | Memutar musik lokal, dll. | Tidak | Android 6 dan versi lebih baru |
WRITE_EXTERNAL_STORAGE | Mengizinkan aplikasi untuk menulis ke penyimpanan eksternal. | Menyimpan file audio dan video, log, dll. | Tidak | Android 6 dan versi lebih baru |
Langkah 4: Cegah obfuscation kode (opsional)
Dalam file app/proguard-rules.pro, konfigurasikan aturan untuk SDK agar antarmuka yang disediakan oleh SDK tidak di-obfuscate, yang dapat menyebabkan pemanggilan fungsi tidak berjalan semestinya.
-keep class com.aliyun.allinone.** {
*;
}
-keep class com.aliyun.rts.network.AliHttpTool {
*;
}
-keep class com.aliyun.common.AlivcBase {
*;
}
-keep class com.huawei.multimedia.alivc.** {
*;
}
-keep class com.alivc.rtc.** {
*;
}
-keep class com.alivc.component.** {
*;
}
-keep class org.webrtc.** {
*;
}Langkah 5: Buat antarmuka pengguna
Buat antarmuka pengguna yang sesuai dengan skenario Anda. Contoh kode berikut untuk skenario panggilan video membuat dua tampilan untuk menampilkan aliran video lokal dan remote. Anda dapat menggunakannya sebagai referensi selama pengembangan.
Implementasi
Bagian ini menjelaskan cara menggunakan ARTC SDK untuk membangun aplikasi audio dan video real-time dasar. Anda dapat menyalin contoh kode lengkap ke dalam proyek Anda untuk menguji fungsionalitasnya. Langkah-langkah di bawah ini menjelaskan pemanggilan API inti.
Diagram berikut menunjukkan alur kerja dasar untuk mengimplementasikan panggilan video:
Contoh kode untuk skenario panggilan video
Untuk detail kode contoh lengkap, lihat Jalankan proyek demo ARTC untuk Android.
1. Minta izin
Saat memulai panggilan video, periksa apakah izin yang diperlukan telah diberikan di aplikasi:
private static final int REQUEST_PERMISSION_CODE = 101;
private static final String[] PERMISSION_MANIFEST = {
Manifest.permission.RECORD_AUDIO,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.CAMERA
};
private static final String[] PERMISSION_MANIFEST33 = {
Manifest.permission.RECORD_AUDIO,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.CAMERA
};
private static String[] getPermissions() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
return PERMISSION_MANIFEST;
}
return PERMISSION_MANIFEST33;
}
public boolean checkOrRequestPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this, "android.permission.CAMERA") != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, "android.permission.RECORD_AUDIO") != PackageManager.PERMISSION_GRANTED) {
requestPermissions(getPermissions(), REQUEST_PERMISSION_CODE);
return false;
}
}
return true;
}2. Dapatkan Token otentikasi
Bergabung ke channel ARTC memerlukan Token otentikasi untuk memverifikasi identitas pengguna. Untuk detail cara pembuatan token, lihat Implementasikan autentikasi berbasis token. Token dapat dihasilkan menggunakan metode parameter tunggal atau metode multi-parameter. Metode yang Anda gunakan menentukan API joinChannel mana yang perlu Anda panggil.
Untuk lingkungan produksi:
Karena pembuatan token memerlukan AppKey Anda, hardcoding-nya di sisi klien menimbulkan risiko keamanan. Di lingkungan produksi, kami sangat merekomendasikan menghasilkan token di server Anda dan mengirimkannya ke klien.
Untuk pengembangan dan debugging:
Saat pengembangan, jika server bisnis Anda belum memiliki logika untuk menghasilkan token, Anda dapat sementara menggunakan logika pembuatan token dari APIExample untuk membuat token sementara. Kode referensinya sebagai berikut:
public final class ARTCTokenHelper {
/**
* RTC AppId
*/
public static String AppId = "";
/**
* RTC AppKey
*/
public static String AppKey = "";
/**
* Hasilkan token parameter tunggal untuk bergabung ke pertemuan berdasarkan channelId, userId, timestamp, dan nonce.
*/
public static String generateSingleParameterToken(String appId, String appKey, String channelId, String userId, long timestamp, String nonce) {
StringBuilder stringBuilder = new StringBuilder()
.append(appId)
.append(appKey)
.append(channelId)
.append(userId)
.append(timestamp);
String token = getSHA256(stringBuilder.toString());
try{
JSONObject tokenJson = new JSONObject();
tokenJson.put("appid", AppId);
tokenJson.put("channelid", channelId);
tokenJson.put("userid", userId);
tokenJson.put("nonce", nonce);
tokenJson.put("timestamp", timestamp);
tokenJson.put("token", token);
String base64Token = Base64.encodeToString(tokenJson.toString().getBytes(StandardCharsets.UTF_8), Base64.NO_WRAP);
return base64Token;
}catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* Hasilkan token parameter tunggal untuk bergabung ke pertemuan berdasarkan channelId, userId, dan timestamp.
*/
public static String generateSingleParameterToken(String appId, String appKey, String channelId, String userId, long timestamp) {
return generateSingleParameterToken(appId, appKey, channelId, userId, timestamp, "");
}
public static String getSHA256(String str) {
try {
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
byte[] hash = messageDigest.digest(str.getBytes(StandardCharsets.UTF_8));
return byte2Hex(hash);
} catch (NoSuchAlgorithmException e) {
// Pertimbangkan untuk mencatat exception dan/atau melemparkannya kembali sebagai RuntimeException
e.printStackTrace();
}
return "";
}
private static String byte2Hex(byte[] bytes) {
StringBuilder stringBuilder = new StringBuilder();
for (byte b : bytes) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) {
// Gunakan tanda kutip tunggal untuk char
stringBuilder.append('0');
}
stringBuilder.append(hex);
}
return stringBuilder.toString();
}
public static long getTimesTamp() {
return System.currentTimeMillis() / 1000 + 60 * 60 * 24;
}
}3. Impor kelas ARTC SDK
Impor kelas dan antarmuka terkait dari ARTC SDK:
// Impor kelas ARTC
import com.alivc.rtc.AliRtcEngine;
import com.alivc.rtc.AliRtcEngineEventListener;
import com.alivc.rtc.AliRtcEngineNotify;4. Buat dan inisialisasi engine
Buat engine RTC
Panggil metode
getInstance[1/2]untuk membuat instansAliRtcEngine.private AliRtcEngine mAliRtcEngine = null; if(mAliRtcEngine == null) { mAliRtcEngine = AliRtcEngine.getInstance(this); }Inisialisasi engine
Panggil
setChannelProfileuntuk mengatur channel keAliRTCSdkInteractiveLive(mode interaktif).Bergantung pada kebutuhan bisnis Anda, Anda dapat memilih mode interaktif, yang cocok untuk skenario hiburan interaktif, atau mode komunikasi, yang cocok untuk siaran satu-ke-satu atau satu-ke-banyak. Memilih mode yang tepat memastikan pengalaman pengguna yang lancar dan penggunaan sumber daya jaringan yang efisien.
Mode
Penerbitan
Berlangganan
Deskripsi
Mode interaktif
Dibatasi oleh peran. Hanya pengguna dengan peran host yang dapat menerbitkan aliran.
Partisipan dapat secara fleksibel mengganti peran sepanjang sesi.
Tidak ada batasan peran. Semua partisipan memiliki izin untuk berlangganan aliran.
Dalam mode interaktif, event seperti host bergabung atau meninggalkan channel, atau mulai menerbitkan aliran, diberitahukan kepada viewer secara real-time. Sebaliknya, aktivitas viewer tidak diberitahukan kepada host, memastikan streaming tidak terganggu.
Dalam mode ini, host bertanggung jawab atas interaksi, sedangkan viewer hanya mengonsumsi konten. Jika kebutuhan bisnis Anda mungkin berubah, pertimbangkan untuk menggunakan mode interaktif secara default. Fleksibilitasnya memungkinkan Anda beradaptasi dengan berbagai kebutuhan interaksi dengan menyesuaikan peran pengguna.
Mode komunikasi
Tidak ada batasan peran. Semua partisipan memiliki izin untuk menerbitkan aliran.
Tidak ada batasan peran. Semua partisipan memiliki izin untuk berlangganan aliran.
Dalam mode komunikasi, partisipan saling mengetahui keberadaan satu sama lain.
Meskipun mode ini tidak membedakan peran pengguna, secara fungsional setara dengan peran host dalam mode interaktif. Tujuannya adalah menyederhanakan operasi, memungkinkan pengguna mencapai fungsionalitas yang diinginkan dengan lebih sedikit pemanggilan API.
Panggil
setClientRoleuntuk mengatur peran pengguna menjadiAliRTCSdkInteractive(host) atauAliRTCSdkLive(viewer). Catatan: Peran host menerbitkan dan berlangganan secara default. Peran viewer hanya berlangganan secara default, dengan pratinjau dan penerbitan dinonaktifkan.CatatanSaat pengguna mengganti peran dalam channel, sistem akan menyesuaikan status penerbitan audio dan video lokal sebagai berikut:
Beralih dari host ke viewer: Sistem menghentikan penerbitan aliran audio dan video lokal. Aliran remote yang telah dilanggan tidak terpengaruh, dan pengguna dapat terus menonton orang lain.
Beralih dari viewer ke host: Sistem mulai menerbitkan aliran audio dan video lokal. Aliran remote yang telah dilanggan tetap tidak berubah, dan pengguna dapat terus menonton partisipan lain.
// Atur mode channel ke mode interaktif, gunakan AliRTCSdkInteractiveLive untuk RTC mAliRtcEngine.setChannelProfile(AliRtcEngine.AliRTCSdkChannelProfile.AliRTCSdkInteractiveLive); // Atur peran pengguna, gunakan AliRTCSdkInteractive untuk menerbitkan dan menarik aliran, gunakan AliRTCSdkLive jika hanya menarik aliran tanpa menerbitkan mAliRtcEngine.setClientRole(AliRtcEngine.AliRTCSdkClientRole.AliRTCSdkInteractive);
Atur callback umum
Jika SDK mengalami masalah selama operasi, SDK akan terlebih dahulu mencoba memulihkan secara otomatis menggunakan mekanisme retry internalnya. Untuk kesalahan yang tidak dapat diselesaikan sendiri, SDK akan memberi tahu aplikasi Anda melalui antarmuka callback yang telah ditentukan.
Berikut adalah callback penting untuk masalah yang tidak dapat ditangani SDK, yang harus didengarkan dan ditanggapi oleh aplikasi Anda:
Penyebab pengecualian
Callback dan parameter
Solusi
Deskripsi
Otentikasi gagal
result di callback onJoinChannelResult mengembalikan AliRtcErrJoinBadToken.
Aplikasi harus memeriksa apakah token benar.
Saat pengguna memanggil API, jika otentikasi gagal, callback API akan mengembalikan kesalahan kegagalan otentikasi.
Token akan kedaluwarsa
onAuthInfoWillExpire
Ambil token baru dan panggil refreshAuthInfo untuk memperbarui informasi.
Kesalahan kedaluwarsa token dapat terjadi baik saat API dipanggil maupun selama runtime. Kesalahan dilaporkan melalui callback API atau callback kesalahan terpisah.
Token kedaluwarsa
onAuthInfoExpired
Aplikasi harus bergabung kembali ke channel.
Kesalahan kedaluwarsa token dapat terjadi baik saat API dipanggil maupun selama runtime. Kesalahan dilaporkan melalui callback API atau callback kesalahan terpisah.
Masalah koneksi jaringan
Callback onConnectionStatusChange mengembalikan AliRtcConnectionStatusFailed.
Aplikasi harus bergabung kembali ke channel.
SDK dapat memulihkan secara otomatis dari gangguan koneksi jaringan singkat. Jika waktu putus melebihi ambang batas, akan terjadi timeout. Aplikasi harus memeriksa status jaringan dan memandu pengguna untuk bergabung kembali.
Dikeluarkan dari channel
onBye
AliRtcOnByeUserReplaced: Periksa apakah pengguna lain telah bergabung dengan userId yang sama.
AliRtcOnByeBeKickedOut: Pengguna dikeluarkan dari channel dan perlu bergabung kembali.
AliRtcOnByeChannelTerminated: Channel dihentikan, dan pengguna perlu bergabung kembali.
Layanan RTC memungkinkan administrator menghapus peserta.
Pengecualian perangkat lokal
onLocalDeviceException
Periksa izin aplikasi dan apakah perangkat keras berfungsi dengan benar.
Saat terjadi pengecualian perangkat lokal yang tidak dapat diselesaikan SDK, SDK akan memberi tahu aplikasi melalui callback. Aplikasi kemudian harus melakukan intervensi untuk memeriksa status perangkat.
private AliRtcEngineEventListener mRtcEngineEventListener = new AliRtcEngineEventListener() { @Override public void onJoinChannelResult(int result, String channel, String userId, int elapsed) { super.onJoinChannelResult(result, channel, userId, elapsed); handleJoinResult(result, channel, userId); } @Override public void onLeaveChannelResult(int result, AliRtcEngine.AliRtcStats stats){ super.onLeaveChannelResult(result, stats); } @Override public void onConnectionStatusChange(AliRtcEngine.AliRtcConnectionStatus status, AliRtcEngine.AliRtcConnectionStatusChangeReason reason){ super.onConnectionStatusChange(status, reason); handler.post(new Runnable() { @Override public void run() { if(status == AliRtcEngine.AliRtcConnectionStatus.AliRtcConnectionStatusFailed) { /* TODO: Harus ditangani. Kami merekomendasikan memberi tahu pengguna. Ini dilaporkan hanya setelah strategi pemulihan internal SDK gagal. */ ToastHelper.showToast(VideoChatActivity.this, R.string.video_chat_connection_failed, Toast.LENGTH_SHORT); } else { /* TODO: Opsional. Tambahkan logika bisnis di sini, biasanya untuk analitik data atau perubahan UI. */ } } }); } @Override public void OnLocalDeviceException(AliRtcEngine.AliRtcEngineLocalDeviceType deviceType, AliRtcEngine.AliRtcEngineLocalDeviceExceptionType exceptionType, String msg){ super.OnLocalDeviceException(deviceType, exceptionType, msg); /* TODO: Harus ditangani. Kami merekomendasikan memberi tahu pengguna tentang kesalahan perangkat. Ini dilaporkan hanya setelah strategi pemulihan internal SDK gagal. */ handler.post(new Runnable() { @Override public void run() { String str = "OnLocalDeviceException deviceType: " + deviceType + " exceptionType: " + exceptionType + " msg: " + msg; ToastHelper.showToast(VideoChatActivity.this, str, Toast.LENGTH_SHORT); } }); } }; private AliRtcEngineNotify mRtcEngineNotify = new AliRtcEngineNotify() { @Override public void onAuthInfoWillExpire() { super.onAuthInfoWillExpire(); /* TODO: Harus ditangani. Saat callback ini dipicu, ambil token baru untuk pengguna dan channel saat ini, lalu panggil refreshAuthInfo untuk memperbaruinya. */ } @Override public void onRemoteUserOnLineNotify(String uid, int elapsed){ super.onRemoteUserOnLineNotify(uid, elapsed); } // Hapus renderer aliran video remote di callback onRemoteUserOffLineNotify. @Override public void onRemoteUserOffLineNotify(String uid, AliRtcEngine.AliRtcUserOfflineReason reason){ super.onRemoteUserOffLineNotify(uid, reason); } // Atur renderer aliran video remote di callback onRemoteTrackAvailableNotify. @Override public void onRemoteTrackAvailableNotify(String uid, AliRtcEngine.AliRtcAudioTrack audioTrack, AliRtcEngine.AliRtcVideoTrack videoTrack){ handler.post(new Runnable() { @Override public void run() { if(videoTrack == AliRtcVideoTrackCamera) { SurfaceView surfaceView = mAliRtcEngine.createRenderSurfaceView(VideoChatActivity.this); surfaceView.setZOrderMediaOverlay(true); FrameLayout view = getAvailableView(); if (view == null) { return; } remoteViews.put(uid, view); view.addView(surfaceView, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); AliRtcEngine.AliRtcVideoCanvas remoteVideoCanvas = new AliRtcEngine.AliRtcVideoCanvas(); remoteVideoCanvas.view = surfaceView; mAliRtcEngine.setRemoteViewConfig(remoteVideoCanvas, uid, AliRtcVideoTrackCamera); } else if(videoTrack == AliRtcVideoTrackNo) { if(remoteViews.containsKey(uid)) { ViewGroup view = remoteViews.get(uid); if(view != null) { view.removeAllViews(); remoteViews.remove(uid); mAliRtcEngine.setRemoteViewConfig(null, uid, AliRtcVideoTrackCamera); } } } } }); } /* Aplikasi Anda juga harus menangani kasus di mana beberapa perangkat mencoba bergabung dengan UserID yang sama. */ @Override public void onBye(int code){ handler.post(new Runnable() { @Override public void run() { String msg = "onBye code:" + code; ToastHelper.showToast(VideoChatActivity.this, msg, Toast.LENGTH_SHORT); } }); } }; mAliRtcEngine.setRtcEngineEventListener(mRtcEngineEventListener); mAliRtcEngine.setRtcEngineNotify(mRtcEngineNotify);
5. Atur properti audio dan video
Atur properti audio
Panggil
setAudioProfileuntuk mengatur mode pengkodean audio dan skenario.mAliRtcEngine.setAudioProfile(AliRtcEngine.AliRtcAudioProfile.AliRtcEngineHighQualityMode, AliRtcEngine.AliRtcAudioScenario.AliRtcSceneMusicMode);Atur properti video
Atur properti untuk aliran video yang diterbitkan, seperti resolusi, bitrate, dan laju frame.
// Atur parameter pengkodean video. AliRtcEngine.AliRtcVideoEncoderConfiguration aliRtcVideoEncoderConfiguration = new AliRtcEngine.AliRtcVideoEncoderConfiguration(); aliRtcVideoEncoderConfiguration.dimensions = new AliRtcEngine.AliRtcVideoDimensions( 720, 1280); aliRtcVideoEncoderConfiguration.frameRate = 20; aliRtcVideoEncoderConfiguration.bitrate = 1200; aliRtcVideoEncoderConfiguration.keyFrameInterval = 2000; aliRtcVideoEncoderConfiguration.orientationMode = AliRtcVideoEncoderOrientationModeAdaptive; mAliRtcEngine.setVideoEncoderConfiguration(aliRtcVideoEncoderConfiguration);
6. Atur properti penerbitan dan langganan
Konfigurasikan penerbitan aliran audio/video dan atur langganan default ke semua aliran pengguna:
Panggil publishLocalAudioStream untuk menerbitkan aliran audio.
Panggil publishLocalVideoStream untuk menerbitkan aliran video. Untuk panggilan hanya audio, Anda dapat mengatur ini ke false.
// SDK menerbitkan audio secara default, sehingga Anda tidak perlu memanggil publishLocalAudioStream.
mAliRtcEngine.publishLocalAudioStream(true);
// Untuk panggilan video, Anda tidak perlu memanggil publishLocalVideoStream(true) karena SDK menerbitkan video secara default.
// Untuk panggilan hanya audio, Anda perlu memanggil publishLocalVideoStream(false) untuk menonaktifkan penerbitan video.
mAliRtcEngine.publishLocalVideoStream(true);
// Atur langganan default ke semua aliran audio dan video remote.
mAliRtcEngine.setDefaultSubscribeAllRemoteAudioStreams(true);
mAliRtcEngine.subscribeAllRemoteAudioStreams(true);
mAliRtcEngine.setDefaultSubscribeAllRemoteVideoStreams(true);
mAliRtcEngine.subscribeAllRemoteVideoStreams(true);Secara default, SDK secara otomatis menerbitkan aliran audio dan video lokal serta berlangganan aliran audio dan video semua pengguna lain dalam channel. Anda dapat memanggil metode di atas untuk mengganti perilaku default ini.
7. Aktifkan pratinjau lokal
Panggil setLocalViewConfig untuk mengatur tampilan render lokal dan mengonfigurasi properti tampilan video lokal.
Panggil startPreview untuk memulai pratinjau video lokal.
mLocalVideoCanvas = new AliRtcEngine.AliRtcVideoCanvas();
SurfaceView localSurfaceView = mAliRtcEngine.createRenderSurfaceView(VideoChatActivity.this);
localSurfaceView.setZOrderOnTop(true);
localSurfaceView.setZOrderMediaOverlay(true);
FrameLayout fl_local = findViewById(R.id.fl_local);
fl_local.addView(localSurfaceView, layoutParams);
mLocalVideoCanvas.view = localSurfaceView;
mAliRtcEngine.setLocalViewConfig(mLocalVideoCanvas, AliRtcVideoTrackCamera);
mAliRtcEngine.startPreview();8. Bergabung ke channel
Panggil joinChannel untuk bergabung ke channel. Jika token dihasilkan menggunakan metode parameter tunggal, panggil operasi joinChannel[1/3]. Jika dihasilkan menggunakan metode multi-parameter, panggil metode joinChannel[2/3]. Hasilnya dikembalikan dalam callback onJoinChannelResult. Nilai result 0 menunjukkan keberhasilan bergabung. Nilai non-nol mungkin menunjukkan token tidak valid.
mAliRtcEngine.joinChannel(token, null, null, null);Setelah bergabung ke channel, SDK akan menerbitkan dan berlangganan aliran sesuai dengan parameter yang diatur sebelum bergabung.
SDK secara otomatis menerbitkan dan berlangganan secara default untuk mengurangi jumlah pemanggilan API yang perlu dilakukan klien.
9. Atur tampilan remote
Saat menginisialisasi engine, atur callback yang sesuai dengan mAliRtcEngine.setRtcEngineNotify. Di callback onRemoteTrackAvailableNotify, Anda dapat mengatur tampilan remote untuk pengguna remote. Contoh kode:
@Override
public void onRemoteTrackAvailableNotify(String uid, AliRtcEngine.AliRtcAudioTrack audioTrack, AliRtcEngine.AliRtcVideoTrack videoTrack){
handler.post(new Runnable() {
@Override
public void run() {
if(videoTrack == AliRtcVideoTrackCamera) {
SurfaceView surfaceView = mAliRtcEngine.createRenderSurfaceView(VideoChatActivity.this);
surfaceView.setZOrderMediaOverlay(true);
FrameLayout fl_remote = findViewById(R.id.fl_remote);
if (fl_remote == null) {
return;
}
fl_remote.addView(surfaceView, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
AliRtcEngine.AliRtcVideoCanvas remoteVideoCanvas = new AliRtcEngine.AliRtcVideoCanvas();
remoteVideoCanvas.view = surfaceView;
mAliRtcEngine.setRemoteViewConfig(remoteVideoCanvas, uid, AliRtcVideoTrackCamera);
} else if(videoTrack == AliRtcVideoTrackNo) {
FrameLayout fl_remote = findViewById(R.id.fl_remote);
fl_remote.removeAllViews();
mAliRtcEngine.setRemoteViewConfig(null, uid, AliRtcVideoTrackCamera);
}
}
});
}10. Tinggalkan channel dan hapus engine
Saat sesi berakhir, tinggalkan channel dan hapus engine:
Panggil
stopPreviewuntuk menghentikan pratinjau video.Panggil
leaveChanneluntuk meninggalkan channel.Panggil
destroyuntuk menghapus engine dan melepaskan sumber dayanya.
private void destroyRtcEngine() {
mAliRtcEngine.stopPreview();
mAliRtcEngine.setLocalViewConfig(null, AliRtcVideoTrackCamera);
mAliRtcEngine.leaveChannel();
mAliRtcEngine.destroy();
mAliRtcEngine = null;
}11. Demonstrasi efek
