Aplikasi ponsel default memungkinkan framework Android Telecom memberi tahu aplikasi tentang status panggilan dengan menggunakan pengelola peran dan layanan dalam panggilan untuk membuat pengganti aplikasi telepon default di perangkat Android, menerapkan InCallService API. Penerapan Anda harus memenuhi persyaratan berikut:
Aplikasi tidak boleh memiliki kemampuan panggilan, dan hanya boleh terdiri dari antarmuka pengguna untuk panggilan. Aplikasi harus menangani semua panggilan yang diketahui oleh framework Telekomunikasi, dan tidak membuat asumsi tentang sifat panggilan tersebut. Misalnya, implementasi tidak boleh mengasumsikan bahwa panggilan adalah panggilan telepon berbasis SIM, atau menerapkan pembatasan panggilan yang didasarkan pada satu ConnectionService, seperti penerapan pembatasan telepon untuk panggilan video.
Aplikasi panggilan memungkinkan pengguna menerima atau melakukan panggilan audio atau video di perangkatnya. Aplikasi panggilan menggunakan antarmuka penggunanya sendiri untuk panggilan, bukan antarmuka aplikasi Telepon default, seperti yang ditunjukkan dalam screenshot berikut ini.
Framework Android menyertakan paket android.telecom
, berisi
class yang membantu Anda membuat aplikasi panggilan sesuai dengan framework
telekomunikasi. Membuat aplikasi sesuai dengan framework telekomunikasi memberikan
manfaat sebagai berikut:
- Aplikasi Anda bekerja sama sebagaimana mestinya dengan subsistem telekomunikasi bawaan dalam perangkat.
- Aplikasi Anda bekerja sama sebagaimana mestinya dengan aplikasi panggilan lain yang juga mematuhi framework.
- Framework ini membantu aplikasi Anda mengelola perutean audio dan video.
- Framework ini membantu aplikasi Anda menentukan apakah panggilannya memiliki fokus.
Izin dan deklarasi manifes
Dalam manifes aplikasi, deklarasikan bahwa aplikasi Anda menggunakan
MANAGE_OWN_CALLS
izin akses, seperti yang ditunjukkan dalam contoh berikut:
<manifest … >
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS"/>
</manifest>
Untuk mengetahui informasi selengkapnya tentang mendeklarasikan izin aplikasi, lihat Izin.
Anda harus mendeklarasikan layanan yang menentukan class yang mengimplementasikan
class ConnectionService
dalam aplikasi Anda. Subsistem
telekomunikasi mengharuskan layanan mendeklarasikan izin BIND_TELECOM_CONNECTION_SERVICE
agar
dapat terikat. Contoh berikut menunjukkan cara mendeklarasikan layanan dalam
manifes aplikasi Anda:
<service android:name="com.example.MyConnectionService"
android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE">
<intent-filter>
<action android:name="android.telecom.ConnectionService" />
</intent-filter>
</service>
Untuk mengetahui informasi selengkapnya tentang mendeklarasikan komponen aplikasi, termasuk layanan, lihat Komponen Aplikasi.
Mengimplementasikan layanan koneksi
Aplikasi panggilan Anda harus menyediakan penerapan class ConnectionService
yang dapat diikat oleh subsistem telekomunikasi.
Implementasi ConnectionService
Anda harus mengganti
metode-metode berikut:
onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)
Subsistem telekomunikasi memanggil metode ini untuk merespons aplikasi Anda yang memanggil
placeCall(Uri, Bundle)
untuk membuat panggilan keluar baru. Aplikasi Anda menampilkan instance baru dari implementasi classConnection
(untuk mengetahui informasi selengkapnya, lihat Mengimplementasikan koneksi) untuk menunjukkan panggilan keluar yang baru. Anda dapat melakukan penyesuaian lebih lanjut pada koneksi keluar dengan melakukan tindakan berikut:- Aplikasi Anda harus memanggil metode
setConnectionProperties(int)
dengan konstantaPROPERTY_SELF_MANAGED
sebagai argumen untuk menunjukkan bahwa koneksi tersebut berasal dari aplikasi panggilan. - Jika aplikasi Anda mendukung penahanan panggilan, panggil metode
setConnectionCapabilities(int)
dan setel argumen ke nilai bit mask dari konstantaCAPABILITY_HOLD
danCAPABILITY_SUPPORT_HOLD
. - Untuk menetapkan nama penelepon, gunakan metode
setCallerDisplayName(String, int)
yang meneruskan konstantaPRESENTATION_ALLOWED
sebagai parameterint
untuk menunjukkan bahwa nama penelepon harus ditampilkan. - Untuk memastikan bahwa panggilan keluar memiliki status video yang sesuai, panggil
metode
setVideoState(int)
dari objekConnection
, lalu kirim nilai yang ditampilkan oleh metodegetVideoState()
dari objekConnectionRequest
.
- Aplikasi Anda harus memanggil metode
onCreateOutgoingConnectionFailed(PhoneAccountHandle, ConnectionRequest)
Subsistem telekomunikasi memanggil metode ini saat aplikasi Anda memanggil metode
placeCall(Uri, Bundle)
dan panggilan keluar tidak dapat dilakukan. Untuk merespons situasi ini, aplikasi Anda harus memberi tahu pengguna (misalnya, menggunakan kotak notifikasi atau toast) bahwa panggilan keluar tidak dapat dilakukan. Ada kemungkinan aplikasi Anda tidak dapat melakukan panggilan jika ada panggilan darurat yang sedang berlangsung, atau jika ada panggilan berlangsung di aplikasi lain yang tidak dapat ditahan sebelum melakukan panggilan Anda.onCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest)
Subsistem telekomunikasi memanggil metode ini saat aplikasi Anda memanggil metode
addNewIncomingCall(PhoneAccountHandle, Bundle)
untuk memberi tahu sistem tentang panggilan masuk baru dalam aplikasi Anda. Aplikasi menampilkan instance baru implementasiConnection
(untuk mengetahui informasi selengkapnya, lihat Mengimplementasikan koneksi) untuk menunjukkan panggilan masuk baru. Anda dapat melakukan penyesuaian lebih lanjut pada koneksi masuk dengan melakukan tindakan berikut:- Aplikasi Anda harus memanggil metode
setConnectionProperties(int)
dengan konstantaPROPERTY_SELF_MANAGED
sebagai argumen untuk menunjukkan bahwa koneksi tersebut berasal dari aplikasi panggilan. - Jika aplikasi Anda mendukung penahanan panggilan, panggil metode
setConnectionCapabilities(int)
dan setel argumen ke nilai bit mask dari konstantaCAPABILITY_HOLD
danCAPABILITY_SUPPORT_HOLD
. - Untuk menetapkan nama penelepon, gunakan metode
setCallerDisplayName(String, int)
yang meneruskan konstantaPRESENTATION_ALLOWED
sebagai parameterint
untuk menunjukkan bahwa nama penelepon harus ditampilkan. - Untuk menentukan nomor telepon atau alamat panggilan masuk, gunakan
metode
setAddress(Uri, int)
dari objekConnection
. - Untuk memastikan bahwa panggilan keluar memiliki status video yang sesuai, panggil
metode
setVideoState(int)
dari objekConnection
, lalu kirim nilai yang ditampilkan oleh metodegetVideoState()
dari objekConnectionRequest
.
- Aplikasi Anda harus memanggil metode
onCreateIncomingConnectionFailed(PhoneAccountHandle, ConnectionRequest)
Subsistem telekomunikasi memanggil metode ini saat aplikasi Anda memanggil metode
addNewIncomingCall(PhoneAccountHandle, Bundle)
untuk memberi tahu Telecom tentang panggilan masuk baru, tetapi panggilan masuk tidak diizinkan (untuk mengetahui informasi selengkapnya, lihat batasan panggilan). Aplikasi Anda harus otomatis menolak panggilan masuk, dengan opsi memposting notifikasi untuk memberi tahu pengguna tentang panggilan tak terjawab.
Mengimplementasikan koneksi
Aplikasi Anda harus membuat subclass Connection
untuk
menunjukkan panggilan di aplikasi. Anda harus mengganti metode berikut dalam
implementasi:
onShowIncomingCallUi()
Subsistem telekomunikasi memanggil metode ini saat Anda menambahkan panggilan masuk baru dan aplikasi harus menampilkan UI panggilan masuknya.
onCallAudioStateChanged(CallAudioState)
Subsistem telekomunikasi memanggil metode ini untuk memberi tahu aplikasi Anda bahwa rute atau mode audio saat ini telah berubah. Pemanggilan ini merupakan respons terhadap perubahan mode audio menggunakan metode
setAudioRoute(int)
dalam aplikasi Anda. Metode ini juga dapat dipanggil jika sistem mengubah rute audio (misalnya, saat koneksi headset Bluetooth terputus).onHold()
Subsistem telekomunikasi memanggil metode ini saat ingin menahan panggilan. Untuk merespons permintaan ini, aplikasi Anda harus menahan panggilan, lalu memanggil metode
setOnHold()
untuk memberi tahu sistem bahwa panggilan sedang ditahan. Subsistem telekomunikasi dapat memanggil metode ini saat layanan dalam panggilan, seperti Android Auto, yang menunjukkan panggilan Anda ingin menyampaikan permintaan pengguna untuk menahan panggilan. Sistem telekomunikasi juga memanggil metode ini jika pengguna membuat suatu panggilan aktif di aplikasi lain. Untuk mengetahui informasi selengkapnya tentang layanan dalam panggilan, lihatInCallService
.onUnhold()
Subsistem telekomunikasi memanggil metode ini saat ingin melanjutkan panggilan yang ditahan. Setelah melanjutkan panggilan, aplikasi harus memanggil metode
setActive()
untuk memberi tahu sistem bahwa panggilan sudah tidak ditahan. Subsistem telekomunikasi dapat memanggil metode ini saat layanan dalam panggilan, seperti Android Auto, yang menunjukkan panggilan Anda ingin menyampaikan permintaan untuk melanjutkan panggilan. Untuk mengetahui informasi selengkapnya tentang layanan dalam panggilan, lihatInCallService
.onAnswer()
Sistem telekomunikasi memanggil metode ini untuk memberi tahu aplikasi Anda bahwa panggilan masuk harus dijawab. Setelah menjawab panggilan, aplikasi harus memanggil metode
setActive()
untuk memberi tahu sistem bahwa panggilan telah dijawab. Subsistem telekomunikasi dapat memanggil metode ini saat aplikasi Anda menambahkan panggilan masuk baru dan sudah ada panggilan yang sedang berlangsung di aplikasi lain yang tidak dapat ditahan. Subsistem telekomunikasi menampilkan UI panggilan masuk atas nama aplikasi Anda pada situasi seperti ini. Framework ini memberikan metode overload yang memberikan dukungan guna menentukan status video untuk menjawab panggilan. Untuk informasi selengkapnya, lihatonAnswer(int)
.onReject()
Subsistem telekomunikasi memanggil metode ini saat ingin menolak panggilan masuk. Setelah menolak panggilan, aplikasi harus memanggil
setDisconnected(DisconnectCause)
dan menentukanREJECTED
sebagai parameter. Kemudian, aplikasi Anda harus memanggil metodedestroy()
untuk memberi tahu sistem bahwa aplikasi telah memproses panggilan. Subsistem telekomunikasi memanggil metode ini setelah pengguna menolak panggilan masuk dari aplikasi Anda.onDisconnect()
Subsistem telekomunikasi memanggil metode ini saat ingin memutuskan panggilan. Setelah panggilan berakhir, aplikasi Anda harus memanggil metode
setDisconnected(DisconnectCause)
dan menetapkanLOCAL
sebagai parameter untuk menunjukkan bahwa permintaan pengguna menyebabkan panggilan terputus. Kemudian, aplikasi Anda harus memanggil metodedestroy()
untuk memberi tahu subsistem telekomunikasi bahwa aplikasi telah memproses panggilan. Sistem dapat memanggil metode ini setelah pengguna memutuskan panggilan melalui layanan dalam panggilan lain seperti Android Auto. Sistem juga memanggil metode ini saat panggilan Anda harus diputus agar panggilan lain dapat dilakukan, misalnya, jika pengguna ingin melakukan panggilan darurat. Untuk mengetahui informasi selengkapnya tentang layanan dalam panggilan, lihatInCallService
.
Menangani skenario panggilan umum
Penggunaan API ConnectionService
dalam alur
panggilan melibatkan interaksi dengan class lain dalam paket
android.telecom
. Bagian berikut ini menjelaskan skenario panggilan umum dan cara
aplikasi Anda menggunakan API untuk menanganinya.
Menjawab panggilan masuk
Alur untuk menangani panggilan masuk berubah saat ada panggilan di aplikasi lain ataupun tidak ada. Alasan adanya perbedaan dalam alur adalah karena framework telekomunikasi harus membuat beberapa batasan saat ada panggilan aktif di aplikasi lain untuk memastikan lingkungan stabil bagi semua aplikasi panggilan di perangkat. Untuk mengetahui informasi selengkapnya, lihat Batasan panggilan.
Tidak ada panggilan aktif di aplikasi lain
Untuk menjawab panggilan masuk saat tidak ada panggilan aktif di aplikasi lain, ikuti langkah-langkah berikut:
- Aplikasi Anda menerima panggilan masuk baru menggunakan mekanisme biasa.
- Gunakan metode
addNewIncomingCall(PhoneAccountHandle, Bundle)
untuk memberi tahu subsistem telekomunikasi tentang panggilan masuk baru. - Subsistem telekomunikasi diikat ke implementasi
ConnectionService
aplikasi Anda dan meminta instance baru classConnection
yang menunjukkan panggilan masuk baru menggunakan metodeonCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest)
. - Subsistem telekomunikasi memberi tahu aplikasi Anda bahwa aplikasi harus menampilkan antarmuka pengguna
panggilan masuk menggunakan metode
onShowIncomingCallUi()
. - Aplikasi Anda menampilkan UI panggilan masuk menggunakan notifikasi dengan intent
layar penuh terkait. Untuk informasi selengkapnya, lihat
onShowIncomingCallUi()
. - Panggil metode
setActive()
jika pengguna menerima panggilan masuk, atausetDisconnected(DisconnectCause)
yang menentukanREJECTED
sebagai parameter diikuti panggilan ke metodedestroy()
jika pengguna menolak panggilan masuk.
Panggilan aktif di aplikasi lain yang tidak dapat ditahan
Untuk menjawab panggilan masuk saat ada panggilan aktif di aplikasi lain yang tidak dapat ditahan, ikuti langkah-langkah berikut:
- Aplikasi Anda menerima panggilan masuk baru menggunakan mekanisme biasa.
- Gunakan metode
addNewIncomingCall(PhoneAccountHandle, Bundle)
untuk memberi tahu subsistem telekomunikasi tentang panggilan masuk baru. - Subsistem telekomunikasi diikat ke implementasi
ConnectionService
aplikasi Anda dan meminta instance baru objekConnection
yang menunjukkan panggilan masuk baru menggunakan metodeonCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest)
. - Subsistem telekomunikasi menampilkan UI panggilan masuk untuk panggilan masuk Anda.
- Jika pengguna menerima panggilan, subsistem telekomunikasi akan memanggil metode
onAnswer()
. Anda harus memanggil metodesetActive()
untuk menunjukkan kepada subsistem telekomunikasi bahwa panggilan telah tersambung. - Jika pengguna menolak panggilan, subsistem telekomunikasi akan memanggil metode
onReject()
. Anda harus memanggil metodesetDisconnected(DisconnectCause)
yang menetapkanREJECTED
sebagai parameter yang diikuti dengan panggilan ke metodedestroy()
.
Melakukan panggilan keluar
Alur untuk melakukan panggilan keluar meliputi penanganan kemungkinan bahwa panggilan tidak dapat dilakukan karena batasan yang diberlakukan oleh framework telekomunikasi. Untuk mengetahui informasi selengkapnya, lihat Batasan panggilan.
Untuk melakukan panggilan keluar, ikuti langkah-langkah berikut:
- Pengguna memulai panggilan keluar dari dalam aplikasi Anda.
- Gunakan metode
placeCall(Uri, Bundle)
untuk memberi tahu subsistem telekomunikasi tentang panggilan keluar. Lihat pertimbangan berikut untuk parameter metode:- Parameter
Uri
menunjukkan alamat tempat panggilan dilakukan. Untuk nomor telepon reguler, gunakan skema URItel:
. - Parameter
Bundle
memungkinkan Anda memberi informasi tentang aplikasi panggilan Anda dengan menambahkan objekPhoneAccountHandle
aplikasi pada tambahanEXTRA_PHONE_ACCOUNT_HANDLE
. Aplikasi Anda harus memberikan objekPhoneAccountHandle
untuk setiap panggilan keluar. - Parameter
Bundle
juga memungkinkan Anda menentukan apakah panggilan keluar melibatkan video dengan menentukan nilaiSTATE_BIDIRECTIONAL
dalam tambahanEXTRA_START_CALL_WITH_VIDEO_STATE
. Perlu diingat bahwa secara default, subsistem telekomunikasi mengalihkan panggilan video ke speaker ponsel.
- Parameter
- Subsistem telekomunikasi diikat ke implementasi
ConnectionService
aplikasi Anda. - Jika aplikasi Anda tidak dapat melakukan panggilan keluar, subsistem telekomunikasi akan memanggil
metode
onCreateOutgoingConnectionFailed(PhoneAccountHandle, ConnectionRequest)
untuk memberi tahu aplikasi bahwa panggilan tidak dapat dilakukan saat ini. Aplikasi Anda harus memberi tahu pengguna bahwa panggilan tidak dapat dilakukan. - Jika aplikasi Anda dapat melakukan panggilan keluar, subsistem telekomunikasi akan memanggil
metode
onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)
. Aplikasi Anda harus menampilkan instance classConnection
untuk menunjukkan panggilan keluar yang baru. Untuk mengetahui informasi selengkapnya tentang properti yang harus ditetapkan dalam koneksi, lihat Mengimplementasikan layanan koneksi. - Setelah panggilan keluar tersambung, panggil metode
setActive()
untuk memberi tahu subsistem telekomunikasi bahwa panggilan telah aktif.
Mengakhiri panggilan
Untuk mengakhiri panggilan, ikuti langkah-langkah berikut:
- Panggil
setDisconnected(DisconnectCause)
yang mengirimLOCAL
sebagai parameter jika pengguna menghentikan panggilan, atau kirimREMOTE
sebagai parameter jika pihak lain menghentikan panggilan. - Panggil metode
destroy()
.
Batasan panggilan
Untuk memastikan pengalaman telepon yang konsisten dan sederhana bagi pengguna Anda, framework
telekomunikasi menerapkan beberapa batasan untuk mengelola panggilan pada perangkat. Misalnya,
anggaplah pengguna telah menginstal aplikasi panggilan yang mengimplementasikan
API ConnectionService
secara mandiri, yaitu FooTalk dan
BarTalk. Jika demikian, batasan berikut berlaku:
Di perangkat yang beroperasi pada API level 27 atau yang lebih rendah, hanya satu aplikasi yang dapat mempertahankan panggilan yang sedang berlangsung pada waktu tertentu. Batasan ini berarti bahwa meskipun pengguna sedang melakukan panggilan menggunakan aplikasi FooTalk, aplikasi BarTalk tidak dapat memulai atau menerima panggilan baru.
Di perangkat yang beroperasi pada API level 28 atau yang lebih tinggi, jika FooTalk dan BarTalk mendeklarasikan izin
CAPABILITY_SUPPORT_HOLD
danCAPABILITY_HOLD
, pengguna dapat melakukan lebih dari satu panggilan sekaligus dengan beralih antara dua aplikasi untuk memulai atau menjawab panggilan lain.Jika pengguna terlibat dalam panggilan biasa yang dikelola (misalnya, menggunakan aplikasi Telepon bawaan), pengguna tidak dapat berada dalam panggilan yang berasal dari aplikasi panggilan. Artinya, jika pengguna sedang melangsungkan panggilan biasa menggunakan operator selulernya, mereka tidak dapat melakukan panggilan FooTalk atau BarTalk secara bersamaan.
Subsistem telekomunikasi memutuskan panggilan aplikasi Anda jika pengguna melakukan panggilan darurat.
Aplikasi Anda tidak dapat menerima atau melakukan panggilan saat pengguna sedang melakukan panggilan darurat.
Jika ada panggilan berlangsung dalam aplikasi panggilan lain saat aplikasi Anda menerima panggilan masuk, menerima panggilan masuk akan mengakhiri panggilan yang sedang berlangsung di aplikasi lain. Aplikasi Anda sebaiknya tidak menampilkan antarmuka pengguna panggilan masuk seperti biasanya. Framework telekomunikasi menampilkan antarmuka pengguna panggilan masuk dan memberi tahu pengguna bahwa menerima panggilan baru akan mengakhiri panggilan yang sedang berlangsung. Artinya, jika pengguna sedang dalam panggilan FooTalk dan aplikasi BarTalk menerima panggilan masuk, framework telekomunikasi memberi tahu pengguna bahwa ada panggilan masuk BarTalk dan menjawab panggilan BarTalk akan mengakhiri panggilan FooTalk.
Menjadi Aplikasi Telepon Default
Aplikasi telepon/telepon default adalah aplikasi yang menyediakan antarmuka pengguna dalam panggilan saat perangkat
dalam panggilan. Pengguna juga dapat melakukan panggilan dan melihat histori panggilan
di perangkat mereka. Perangkat dipaketkan dengan aplikasi telepon/telepon default yang disediakan sistem. Pengguna
dapat memilih satu aplikasi untuk mengambil
alih peran ini dari aplikasi sistem. Aplikasi yang ingin
memenuhi peran ini menggunakan RoleManager
untuk meminta mereka mengisi
Peran RoleManager.ROLE_DIALER
.
Aplikasi telepon default menyediakan antarmuka pengguna saat perangkat sedang dalam panggilan, dan perangkat
tidak dalam mode mobil (yaitu UiModeManager#getCurrentModeType()
tidak dalam mode mobil
Configuration.UI_MODE_TYPE_CAR
).
Untuk mengisi peran RoleManager.ROLE_DIALER
, aplikasi harus memenuhi
jumlah persyaratan:
- Aplikasi harus menangani intent
Intent#ACTION_DIAL
. Artinya, aplikasi harus menyediakan UI tombol nomor bagi pengguna untuk memulai panggilan keluar. - Aplikasi ini harus sepenuhnya mengimplementasikan
InCallService
API dan menyediakan panggilan masuk UI, serta UI panggilan yang sedang berlangsung.
Catatan: Jika aplikasi yang mengisi RoleManager.ROLE_DIALER
menampilkan
null
InCallService
selama binding, framework Telecom akan otomatis jatuh
kembali menggunakan aplikasi telepon
yang dimuat sebelumnya di perangkat. Sistem akan menampilkan notifikasi kepada
pengguna untuk memberi tahu bahwa panggilan mereka dilanjutkan
menggunakan aplikasi telepon yang dimuat sebelumnya. Nama
aplikasi tidak boleh menampilkan binding null
; melakukannya berarti tindakan tersebut tidak memenuhi
persyaratan RoleManager.ROLE_DIALER
.
Catatan: Jika aplikasi Anda mengisi RoleManager.ROLE_DIALER
dan melakukan perubahan di
yang menyebabkannya tidak lagi
memenuhi persyaratan peran ini,
RoleManager
akan otomatis menghapus aplikasi Anda dari peran dan menutupnya
aplikasi Anda. Misalnya, jika Anda menggunakan
PackageManager.setComponentEnabledSetting(ComponentName, int, int)
hingga
secara terprogram menonaktifkan InCallService
yang dideklarasikan aplikasi Anda dalam manifesnya, aplikasi Anda
tidak lagi memenuhi persyaratan yang diharapkan untuk
RoleManager.ROLE_DIALER
.
Aplikasi telepon bawaan akan SELALU digunakan saat pengguna melakukan panggilan darurat, meskipun
aplikasi mengisi peran RoleManager.ROLE_DIALER
. Untuk memastikan
saat melakukan panggilan darurat, penelepon default SELALU menggunakan
TelecomManager.placeCall(Uri, Bundle)
untuk melakukan panggilan (termasuk
panggilan darurat). Hal ini memastikan bahwa platform dapat memverifikasi bahwa permintaan berasal dari
dialer {i>default<i}. Jika aplikasi telepon yang tidak dimuat sebelumnya menggunakan Intent#ACTION_CALL
untuk menempatkan
panggilan darurat, panggilan ini akan diteruskan ke aplikasi telepon bawaan menggunakan Intent#ACTION_DIAL
untuk konfirmasi; pengalaman pengguna
menjadi kurang optimal.
Berikut adalah contoh pendaftaran manifes untuk InCallService
. Meta-data
TelecomManager#METADATA_IN_CALL_SERVICE_UI
menunjukkan bahwa
Implementasi InCallService
dimaksudkan untuk menggantikan UI dalam panggilan bawaan.
TelecomManager#METADATA_IN_CALL_SERVICE_RINGING
metadata menunjukkan bahwa
InCallService
akan memutar nada dering untuk panggilan masuk. Lihat
di bawah untuk informasi selengkapnya tentang cara menampilkan panggilan masuk
UI dan memutar nada dering di aplikasi Anda.
<service android:name="your.package.YourInCallServiceImplementation"
android:permission="android.permission.BIND_INCALL_SERVICE"
android:exported="true">
<meta-data android:name="android.telecom.IN_CALL_SERVICE_UI" android:value="true" />
<meta-data android:name="android.telecom.IN_CALL_SERVICE_RINGING"
android:value="true" />
<intent-filter>
<action android:name="android.telecom.InCallService"/>
</intent-filter>
</service>
Catatan: Anda TIDAK boleh menandai InCallService
dengan atribut
android:exported="false"
; melakukannya dapat mengakibatkan kegagalan untuk mengikat implementasi Anda
selama panggilan berlangsung.
Selain menerapkan API InCallService
, Anda juga harus mendeklarasikan aktivitas di
manifes Anda yang menangani intent Intent#ACTION_DIAL
. Contoh di bawah ini menggambarkan
bagaimana hal ini dilakukan:
<activity android:name="your.package.YourDialerActivity"
android:label="@string/yourDialerActivityLabel">
<intent-filter>
<action android:name="android.intent.action.DIAL" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.DIAL" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="tel" />
</intent-filter>
</activity>
Saat pengguna menginstal aplikasi Anda dan menjalankannya untuk pertama kalinya, Anda harus menggunakan
RoleManager
untuk meminta pengguna mengetahui apakah mereka ingin aplikasi Anda melakukannya
menjadi aplikasi telepon default baru.
Kode di bawah menunjukkan cara aplikasi Anda dapat meminta untuk menjadi aplikasi telepon/telepon default:
private static final int REQUEST_ID = 1;
public void requestRole() {
RoleManager roleManager = (RoleManager) getSystemService(ROLE_SERVICE);
Intent intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_DIALER);
startActivityForResult(intent, REQUEST_ID);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_ID) {
if (resultCode == android.app.Activity.RESULT_OK) {
// Your app is now the default dialer app
} else {
// Your app is not the default dialer app
}
}
}
Akses ke InCallService untuk Perangkat Wearable
-
Jika aplikasi Anda adalah aplikasi pendamping pihak ketiga dan ingin mengakses InCallService API,
aplikasi Anda adalah:
- Mendeklarasikan izin MANAGE_ONGOING_CALLS dalam manifes Anda
- Mengaitkan dengan perangkat fisik wearable melalui
CompanionDeviceManager
API sebagai aplikasi pendamping. Lihat: https://developer.android.com/guide/topics/Connectivity/Companion-device-pairing - Terapkan InCallService ini dengan izin BIND_INCALL_SERVICE
Menampilkan Notifikasi Panggilan Masuk
Saat aplikasi Anda menerima panggilan masuk baru melaluiInCallService#onCallAdded(Call)
,
bertanggung jawab untuk menampilkan UI
panggilan masuk untuk panggilan masuk. Seharusnya, cara ini bisa dilakukan dengan
NotificationManager
API untuk memposting notifikasi panggilan masuk baru.
Jika aplikasi Anda mendeklarasikan TelecomManager#METADATA_IN_CALL_SERVICE_RINGING
metadata,
bertanggung jawab untuk memutar nada dering untuk panggilan masuk. Aplikasi Anda harus membuat
NotificationChannel
yang menentukan nada dering yang diinginkan. Contoh:
NotificationChannel channel = new NotificationChannel(YOUR_CHANNEL_ID, "Incoming Calls",
NotificationManager.IMPORTANCE_MAX);
// other channel setup stuff goes here.
// We'll use the default system ringtone for our incoming call notification channel. You can
// use your own audio resource here.
Uri ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
channel.setSound(ringtoneUri, new AudioAttributes.Builder()
// Setting the AudioAttributes is important as it identifies the purpose of your
// notification sound.
.setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.build());
NotificationManager mgr = getSystemService(NotificationManager.class);
mgr.createNotificationChannel(channel);
Saat menerima panggilan masuk baru, aplikasi Anda akan membuat Notification
untuk
panggilan masuk dan mengaitkannya dengan saluran notifikasi panggilan masuk. Anda dapat menentukan
PendingIntent
pada notifikasi yang akan meluncurkan layar penuh Anda
UI panggilan masuk. Kerangka kerja pengelola notifikasi akan menampilkan notifikasi Anda sebagai
notifikasi peringatan dini jika pengguna aktif menggunakan ponsel. Saat pengguna tidak menggunakan
ponsel, UI panggilan masuk layar penuh Anda akan digunakan.
Contoh:
// Create an intent which triggers your fullscreen incoming call user interface.
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION | Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClass(context, YourIncomingCallActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intent, PendingIntent.FLAG_MUTABLE_UNAUDITED);
// Build the notification as an ongoing high priority item; this ensures it will show as
// a heads up notification which slides down over top of the current content.
final Notification.Builder builder = new Notification.Builder(context);
builder.setOngoing(true);
builder.setPriority(Notification.PRIORITY_HIGH);
// Set notification content intent to take user to the fullscreen UI if user taps on the
// notification body.
builder.setContentIntent(pendingIntent);
// Set full screen intent to trigger display of the fullscreen UI when the notification
// manager deems it appropriate.
builder.setFullScreenIntent(pendingIntent, true);
// Setup notification content.
builder.setSmallIcon( yourIconResourceId );
builder.setContentTitle("Your notification title");
builder.setContentText("Your notification content.");
// Use builder.addAction(..) to add buttons to answer or reject the call.
NotificationManager notificationManager = mContext.getSystemService(
NotificationManager.class);
notificationManager.notify(YOUR_CHANNEL_ID, YOUR_TAG, YOUR_ID, builder.build());
```