Aplikasi VoIP dapat mengintegrasikan panggilannya ke log panggilan sistem. Hal ini memungkinkan pengguna melihat histori panggilan VoIP mereka secara terpusat di aplikasi telepon sistem dan melakukan panggilan balik langsung dari aplikasi telepon. Panduan ini menjelaskan perubahan yang diperlukan pada aplikasi panggilan VoIP, aplikasi telepon sistem, dan pengelolaan setelan histori panggilan terpadu.
Perubahan untuk aplikasi panggilan
Untuk mengintegrasikan aplikasi VoIP dengan log panggilan sistem, ikuti langkah-langkah berikut.
Mendaftarkan filter intent callback
Daftarkan intent yang dilindungi sistem TelecomManager.ACTION_CALL_BACK.
Setelah filter intent ini didaftarkan dengan benar, panggilan apa pun yang ditambahkan aplikasi Anda menggunakan
CallsManager.addCall atau Telecom API terkait lainnya akan otomatis
dicatat oleh sistem. Sistem menggunakan intent terdaftar ini untuk mengirim callback ke aplikasi Anda nanti saat pengguna memilih entri log panggilan VoIP di aplikasi telepon untuk melakukan panggilan balik.
<!-- Activity to handle the callback intent from the system dialer --> <activity android:name=".VoipCallActivity" android:exported="true"> <!-- Register callback intent --> <intent-filter> <action android:name="android.telecom.action.CALL_BACK" /> </intent-filter> </activity>
Mengecualikan pencatatan panggilan
Setelah callback didaftarkan, semua panggilan akan dicatat ke aplikasi telepon sistem. Untuk mengecualikan panggilan berdasarkan per panggilan, tetapkan isLogExcluded
boolean ke true dalam CallAttributesCompat.
CallAttributesCompat( displayName = displayName, address = address, isLogExcluded = excludeCallLogging, // to exclude call from logging direction = if (isIncoming) { CallAttributesCompat.DIRECTION_INCOMING } else { CallAttributesCompat.DIRECTION_OUTGOING }, callType = CallAttributesCompat.CALL_TYPE_AUDIO_CALL, callCapabilities = ( CallAttributesCompat.SUPPORTS_SET_INACTIVE or CallAttributesCompat.SUPPORTS_STREAM or CallAttributesCompat.SUPPORTS_TRANSFER ), )
Menangani callback
Panggilan yang ditambahkan melalui CallsManager.addCall akan mendapatkan UUID unik melalui
CallControlScope.getCallId.
// check the intent action for CALL_BACK if (intent.action == TelecomManager.ACTION_CALL_BACK) { launchCall( // fetching stored call details for the UUID to initiate callback callDetails = getCallDetails( uuid = intent.getStringExtra(TelecomManager.EXTRA_UUID) ) ) }
Memverifikasi entri log panggilan
Log panggilan sistem mempertahankan jumlah entri yang terbatas dan akhirnya menghapus catatan panggilan lama. Karena aplikasi menyimpan pemetaan UUID ke detail panggilan untuk penanganan callback, aplikasi harus memeriksa secara berkala UUID mana yang masih ada di log panggilan sistem. Jika UUID tidak lagi ada di log sistem, pengguna tidak dapat memulai callback untuk panggilan tersebut, dan aplikasi dapat menghapus pemetaan dengan aman dari penyimpanan lokalnya. Praktik ini membantu mengoptimalkan penyimpanan.
Untuk mendapatkan daftar UUID saat ini yang dikaitkan dengan aplikasi dalam log sistem, gunakan CallLog.Calls.CONTENT_VOIP_URI.
Perubahan untuk aplikasi telepon
Ikuti langkah-langkah berikut untuk mengaktifkan aplikasi telepon agar dapat menampilkan log panggilan VoIP dan memulai callback ke aplikasi VoIP.
Menampilkan log panggilan VoIP di aplikasi telepon
Secara default, log panggilan aplikasi VoIP tidak muncul di aplikasi telepon. Untuk menampilkan log panggilan terintegrasi di aplikasi telepon, lakukan hal berikut:
Di Android 16.1 (level API 36.1), tambahkan parameter kueri
include_voip_callske penyedia kontenCallLog.Callsuntuk menampilkan log panggilan VoIP:CallLog.Calls.CONTENT_URI.buildUpon() .appendQueryParameter("include_voip_calls", "true") .build()
Di Android 17 (level API 37) dan yang lebih tinggi, gunakan penyedia konten dan kunci parameter yang diformalkan berikut:
Memulai callback dari aplikasi telepon
Untuk memulai callback dari aplikasi telepon, gunakan TelecomManager.placeCall. Platform menggunakan CallLog.Calls._ID unik dari entri log panggilan untuk meluncurkan aplikasi VoIP yang benar. Peluncuran ini mencakup intent TelecomManager.ACTION_CALL_BACK, yang merupakan tindakan yang ditentukan sistem untuk memulai panggilan balik. Intent ini berisi UUID dalam
intent tambahan TelecomManager.EXTRA_UUID, sehingga aplikasi VoIP dapat mengidentifikasi
panggilan tertentu yang dipanggil kembali.
// Uri generated with unique ID of the call log entry to launch the respective VoIP app for callback val address = ContentUris.withAppendedId(CallLog.Calls.CONTENT_URI, callId) // extra information required to initiate callback val extras = Bundle() telecomManager.placeCall(address, extras)
Mengelola setelan histori panggilan terpadu
Mulai Android 17 (level API 37), pengguna dapat melihat dan mengaktifkan/menonaktifkan histori panggilan terpadu berdasarkan per aplikasi di setelan sistem (biasanya di bagian Setelan > Akun panggilan > Log panggilan terintegrasi atau langsung di dalam aplikasi telepon default mereka). Aplikasi panggilan pihak ketiga dan aplikasi telepon dapat berinteraksi dengan setelan ini.
Mengarahkan pengguna ke setelan
Untuk membuka setelan histori panggilan terpadu, mulai aktivitas dengan tindakan intent
TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION:
val intent = Intent(TelecomManager.ACTION_CONFIGURE_CALL_LOG_INTEGRATION) startActivity(intent)
Saat pengguna menonaktifkan histori panggilan terpadu untuk aplikasi di setelan sistem, sistem akan segera dan secara permanen menghapus semua entri log panggilan yang ada untuk paket tersebut dari penyedia log panggilan native (CallLog.Calls). Panggilan mendatang yang dimulai oleh atau diterima untuk aplikasi tersebut tidak akan dicatat di aplikasi telepon sistem.
Memproses perubahan preferensi
Agar tetap disinkronkan saat pengguna mengaktifkan atau menonaktifkan histori panggilan terpadu untuk
aplikasi panggilan Anda di setelan sistem atau aplikasi telepon, daftarkan penerima siaran
untuk intent siaran TelecomManager.ACTION_VOIP_CALL_LOG_PREFERENCE
(android.telecom.action.VOIP_CALL_LOG_PREFERENCE):
val receiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (intent.action == TelecomManager.ACTION_VOIP_CALL_LOG_PREFERENCE) { // Status of the Unified Call History of the app val isEnabled = intent.getBooleanExtra( TelecomManager.EXTRA_VOIP_CALL_LOG_PREFERENCE_STATUS, true ) } } }
Saat pengguna mengalihkan tombol, platform akan menyiarkan intent ini ke aplikasi
Anda yang berisi status boolean yang diperbarui di tambahan
TelecomManager.EXTRA_VOIP_CALL_LOG_PREFERENCE_STATUS. Daripada menunggu verifikasi berkala terhadap CallLog.Calls, aplikasi Anda dapat memproses siaran ini. Saat histori panggilan terpadu dinonaktifkan (dengan kata lain, ditetapkan ke false), aplikasi Anda dapat memperbarui status internalnya atau melakukan pembersihan seperti menghapus pemetaan panggilan yang di-cache secara lokal yang digunakan untuk penanganan callback.