Histori panggilan terpadu

Aplikasi VoIP dapat mengintegrasikan panggilannya ke log panggilan sistem. Hal ini memungkinkan pengguna melihat histori panggilan VoIP mereka secara terpusat di aplikasi dialer sistem dan melakukan panggilan balik langsung dari aplikasi dialer. Panduan ini menjelaskan perubahan yang diperlukan pada aplikasi panggilan VoIP, aplikasi dialer sistem, dan pengelolaan setelan histori panggilan terpadu.

Perubahan untuk aplikasi panggilan

Untuk mengintegrasikan aplikasi VoIP Anda 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, setiap panggilan yang ditambahkan aplikasi Anda menggunakan CallsManager.addCall atau API Telecom terkait lainnya akan otomatis dicatat oleh sistem. Sistem menggunakan intent terdaftar ini untuk mengirimkan 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 logging panggilan

Setelah callback didaftarkan, semua panggilan akan dicatat ke dalam aplikasi telepon sistem. Untuk mengecualikan panggilan berdasarkan per panggilan, tetapkan boolean isLogExcluded 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 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 menyimpan sejumlah entri terbatas dan pada akhirnya menghapus catatan panggilan lama. Karena aplikasi menyimpan pemetaan UUID untuk memanggil detail untuk penanganan callback, aplikasi harus memeriksa secara berkala UUID mana yang masih ada dalam 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 diatribusikan ke aplikasi dalam log sistem, gunakan CallLog.Calls.CONTENT_VOIP_URI.

Perubahan untuk aplikasi telepon

Ikuti langkah-langkah berikut untuk mengaktifkan aplikasi dialer agar menampilkan log panggilan VoIP dan memulai panggilan balik 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:

Memulai panggilan balik dari aplikasi telepon

Untuk memulai callback dari dialer, gunakan TelecomManager.placeCall. Platform menggunakan CallLog.Calls._ID unik 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 panggilan di ekstra intent TelecomManager.EXTRA_UUID, sehingga aplikasi VoIP dapat mengidentifikasi panggilan spesifik mana yang dipanggil balik.

// 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 dialer default mereka). Aplikasi panggilan pihak ketiga dan aplikasi dialer dapat berinteraksi dengan setelan ini.

Untuk membuka setelan histori panggilan gabungan, 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 bawaan (CallLog.Calls). Panggilan mendatang yang dimulai oleh atau diterima untuk aplikasi tersebut tidak akan direkam di dialer sistem.

Memantau perubahan preferensi

Agar tetap disinkronkan saat pengguna mengaktifkan atau menonaktifkan histori panggilan gabungan 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 membalikkan tombol, platform akan menyiarkan maksud ini ke aplikasi Anda yang berisi status boolean yang diperbarui dalam ekstra TelecomManager.EXTRA_VOIP_CALL_LOG_PREFERENCE_STATUS. Daripada menunggu verifikasi berkala terhadap CallLog.Calls, aplikasi Anda dapat memproses siaran ini. Jika histori panggilan terpadu dinonaktifkan (dengan kata lain, disetel 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.