Fitur dalam panduan ini menjelaskan kemampuan pengelolaan jaringan dan telepon yang dapat Anda implementasikan di aplikasi pengontrol kebijakan perangkat (DPC). Dokumen ini berisi contoh kode dan Anda juga dapat menggunakan aplikasi Test DPC sebagai sumber kode contoh untuk fitur perusahaan Android.
Aplikasi DPC dapat berjalan dalam mode pemilik profil di perangkat pribadi atau dalam mode pemilik perangkat di perangkat terkelola sepenuhnya. Tabel ini menunjukkan fitur mana saja yang tersedia saat DPC berjalan dalam mode pemilik profil atau mode pemilik perangkat:
Fitur | Pemilik profil | Pemilik perangkat |
Mengakses kontak kerja di seluruh profil | ✓ | |
Pastikan koneksi jaringan yang aman untuk traffic kerja | ✓ | ✓ |
Menyiapkan satu ID jaringan nirkabel di seluruh region | ✓ | ✓ |
Menentukan telepon terpisah untuk profil kerja | ✓ |
Mengakses kontak kerja di seluruh profil
EMM dapat mengizinkan profil pribadi pengguna mengakses kontak kerja sehingga kontak pribadi dan kerja pengguna dapat diakses melalui penelusuran lokal dan pencarian direktori jarak jauh. Pada perangkat pribadi, satu telepon di profil pribadi dapat melakukan dan menerima panggilan pribadi serta panggilan kerja. Selain itu, kontak kerja terintegrasi dengan baik ke dalam UI sistem. Jika profil kerja dienkripsi, datanya tidak akan tersedia untuk profil pribadi.
Terintegrasi dengan UI sistem
UI sistem menunjukkan panggilan kerja yang masuk menggunakan ikon koper. callLog
juga menampilkan
ikon untuk menetapkan panggilan kerja yang masuk dan keluar. Aplikasi telepon dan
kontak pribadi dapat menampilkan informasi ID penelepon kontak kerja menggunakan pencarian
direktori jarak jauh, sehingga kontak tidak harus disinkronkan di
perangkat lokal. Aplikasi pesan dapat melakukan penelusuran dan ID penelepon lokal.
Dokumen Definisi Kompatibilitas Android (CDD) mencakup persyaratan agar kontak kerja ditampilkan di telepon default, serta persyaratan bahwa kontak dan aplikasi pesan diberi badge untuk menunjukkan bahwa kontak tersebut berasal dari profil kerja.
Kontak bisnis dapat diakses dan ditelusuri
Pengguna dapat mengakses dan memanggil kontak kerja dari profil pribadi mereka, yang ditampilkan di layar penelusuran aplikasi telepon. Pengguna dapat menelusuri kontak kerja—menggunakan pelengkapan otomatis—yang disinkronkan secara lokal ke perangkat, dan dicantumkan melalui pencarian direktori jarak jauh.
Mengontrol kontak kerja di profil utama
DPC mengontrol izin untuk menelusuri kontak kerja. Berjalan dalam mode pemilik profil, DPC mengelola visibilitas kontak kerja di profil pribadi. Untuk mengetahui informasi selengkapnya, lihat Membangun pengontrol kebijakan perangkat.
Penelusuran kontak kerja menurut profil pribadi diaktifkan secara default.
Untuk melihat cara kebijakan disetel, gunakan
DevicePolicyManager.getCrossProfileContactsSearchDisabled()
.Untuk mengaktifkan atau menonaktifkan penelusuran kontak kerja menurut profil pribadi, gunakan
DevicePolicyManager.setCrossProfileContactsSearchDisabled()
.
Pastikan koneksi jaringan yang aman untuk traffic kerja
Berjalan dalam mode pemilik perangkat atau mode pemilik profil, pengontrol kebijakan perangkat dapat menggunakan koneksi Virtual Private Network (VPN) yang selalu aktif untuk memaksa aplikasi meneruskan traffic melalui aplikasi VPN tertentu yang tidak dapat dilewati. Dengan koneksi VPN yang selalu aktif, DPC dapat memastikan bahwa traffic jaringan dari profil kerja atau perangkat terkelola melewati layanan VPN, dan tanpa campur tangan pengguna. Proses ini menghasilkan koneksi jaringan yang aman untuk traffic berkelanjutan dalam profil kerja.
Tentang koneksi VPN yang selalu aktif
Sebagai bagian dari framework sistem, pemilihan rute VPN dikelola secara otomatis sehingga
pengguna tidak dapat mengabaikan layanan VPN. Jika layanan VPN terputus saat dalam
mode kunci total, traffic tidak dapat bocor ke Internet terbuka. Untuk aplikasi
yang mengimplementasikan
VpnService
,
VPN yang selalu aktif menyediakan framework untuk mengelola koneksi VPN yang aman melalui
server tepercaya dan mempertahankannya. Layanan VPN akan otomatis memulai ulang
koneksi saat terjadi update aplikasi, terlepas dari apakah koneksi dilakukan melalui Wi-Fi atau
seluler. Dan jika perangkat dimulai ulang, framework akan memulai ulang koneksi VPN.
Koneksi ke layanan VPN bersifat transparan bagi pengguna. Untuk perangkat milik perusahaan, pengguna tidak perlu mengonfirmasi dialog izin untuk VPN dalam mode selalu aktif. Setelan jaringan VPN pengguna memungkinkan koneksi selalu aktif diaktifkan secara manual.
Jika DISALLOW_CONFIG_VPN
adalah true
, pengguna tidak dapat mengonfigurasi VPN. Aktifkan
DISALLOW_DEBUGGING_FEATURES
untuk membatasi pengguna agar tidak mengganti VPN yang selalu aktif menggunakan perintah debug adb.
Untuk mencegah pengguna meng-uninstal VPN, panggil
DevicePolicyManager.setUninstallBlocked
.
Menyiapkan layanan VPN
Organisasi yang menggunakan solusi perusahaan Anda untuk Android menyiapkan VPN.
- Instal aplikasi VPN yang mengimplementasikan
VpnService
. Anda dapat menemukan layanan VPN yang aktif menggunakan filter intent yang cocok dengan tindakanVpnService.SERVICE_INTERFACE
. - Deklarasikan
VpnService
dalam manifes aplikasi yang dilindungi oleh izinBIND_VPN_SERVICE
. - Konfigurasikan
VpnService
agar dimulai oleh sistem. Hindari menyetel aplikasi VPN agar memulai sendiri dengan memproses booting sistem dan mengontrol siklus prosesnya sendiri. - Tetapkan konfigurasi terkelola untuk aplikasi VPN (lihat contoh di bawah).
Mengaktifkan koneksi VPN yang selalu aktif
DPC dapat mengonfigurasi koneksi VPN yang selalu aktif melalui aplikasi tertentu dengan
memanggil
DevicePolicyManager.setAlwaysOnVpnPackage()
.
Koneksi ini diberikan secara otomatis dan tetap ada setelah reboot. Jika
lockdownEnabled
disetel ke salah (false), traffic jaringan mungkin tidak aman sejak
ponsel dimulai ulang dan VPN terhubung. Hal ini berguna jika Anda tidak ingin menghentikan
konektivitas jaringan setiap kali VPN gagal, atau jika VPN tidak penting.
Memverifikasi koneksi VPN yang selalu aktif
DPC dapat membaca nama paket yang mengelola koneksi
VPN yang selalu aktif untuk pengguna saat ini dengan
DevicePolicyManager.getAlwaysOnVpnPackage().
Jika tidak ada paket tersebut, atau VPN dibuat dalam aplikasi Setelan
sistem, null
akan ditampilkan.
Contoh
Di aplikasi TestDPC, AlwaysOnVpnFragment.java
menggunakan API ini untuk mengaktifkan setelan koneksi VPN yang selalu aktif.
Dalam contoh berikut:
- Konfigurasi
terkelola
layanan VPN ditetapkan oleh
DevicePolicyManager
menggunakan metodesetApplicationRestrictions()
. - Konfigurasi terkelola menggunakan key-value pair arbitrer dan aplikasi contoh ini menggunakannya di tempat lain untuk mengonfigurasi setelan jaringan VPN (lihat Memeriksa Konfigurasi Terkelola).
- Contoh ini menambahkan penginstal paket Android ke daftar tolak sehingga tidak mengupdate paket sistem melalui VPN. Semua traffic jaringan pengguna dalam profil kerja atau perangkat melewati aplikasi VPN ini, kecuali penginstal paket; updatenya menggunakan Internet terbuka.
- Kemudian,
DevicePolicyManager
akan mengaktifkan koneksi VPN yang selalu aktif untuk paket VPN menggunakansetAlwaysOnVpnPackage()
, dan mengaktifkan mode kunci total.
Kotlin
// Set VPN's managed configurations val config = Bundle().apply { putString(Extras.VpnApp.ADDRESS, "192.0.2.0") putString(Extras.VpnApp.IDENTITY, "vpn.account1") putString(Extras.VpnApp.CERTIFICATE, "keystore://auth_certificate") putStringArray(Extras.VpnApp.DENYLIST, arrayOf("com.android.packageinstaller")) } val dpm = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager val admin = myDeviceAdminReceiver.getComponentName(this) // Name of package to update managed configurations val vpnPackageName = "com.example.vpnservice" // Associate managed configurations with DeviceAdminReceiver dpm.setApplicationRestrictions(admin, vpnPackageName, config) // Enable always-on VPN connection through VPN package try { val lockdownEnabled = true dpm.setAlwaysOnVpnPackage(admin, vpnPackageName, lockdownEnabled) } catch (ex: Exception) { throw PolicyException() }
Java
// Set VPN's managed configurations final Bundle config = new Bundle(); config.putString(Extras.VpnApp.ADDRESS, "192.0.2.0"); config.putString(Extras.VpnApp.IDENTITY, "vpn.account1"); config.putString(Extras.VpnApp.CERTIFICATE, "keystore://auth_certificate"); config.putStringArray(Extras.VpnApp.DENYLIST, new String[]{"com.android.packageinstaller"}); DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); ComponentName admin = myDeviceAdminReceiver.getComponentName(this); // Name of package to update managed configurations final String vpnPackageName = "com.example.vpnservice"; // Associate managed configurations with DeviceAdminReceiver dpm.setApplicationRestrictions(admin, vpnPackageName, config); // Enable always-on VPN connection through VPN package try { boolean lockdownEnabled = true; dpm.setAlwaysOnVpnPackage(admin, vpnPackageName, lockdownEnabled)); } catch (Exception ex) { throw new PolicyException(...); }
Siapkan satu ID jaringan nirkabel di seluruh region
Berjalan dalam mode pemilik perangkat atau mode pemilik profil, pengontrol kebijakan perangkat (DPC) dapat mengaitkan beberapa sertifikat certificate authority (CA) dengan satu konfigurasi jaringan nirkabel. Dengan konfigurasi ini, perangkat dapat terhubung ke titik akses nirkabel yang memiliki nama jaringan, atau ID set layanan (SSID) yang sama, tetapi dikonfigurasi dengan sertifikat CA yang berbeda. Hal ini berguna jika jaringan nirkabel organisasi Anda berada di beberapa region geografis, dan setiap wilayah memerlukan certificate authority yang berbeda. Misalnya, tanda tangan hukum dapat mewajibkan otoritas lokal yang memerlukan CA regional.
Catatan: Android telah mendukung
setCaCertificate
sejak API 18 (Jelly Bean), tetapi admin IT harus menyediakan jaringan
secara terpisah dengan setiap CA untuk memastikan perangkat memiliki autentikasi yang lancar di setiap
titik akses, terlepas dari region mereka.
Menentukan sertifikat CA untuk mengidentifikasi server
Untuk menentukan daftar sertifikat X.509 yang mengidentifikasi server menggunakan SSID
yang sama, sertakan semua CA yang relevan dalam konfigurasi nirkabel menggunakan WifiEnterpriseConfig.setCaCertificates()
.
Sertifikat server valid jika CA-nya cocok dengan salah satu sertifikat yang diberikan.
Nama default secara otomatis ditetapkan ke sertifikat dan digunakan dalam konfigurasi. WifiManager
menginstal sertifikat dan otomatis menyimpan konfigurasi saat
jaringan diaktifkan, dan menghapus sertifikat saat konfigurasi
dihapus.
Untuk mendapatkan semua sertifikat CA yang terkait dengan konfigurasi nirkabel, gunakan
WifiEnterpriseConfig.getCaCertificates()
untuk menampilkan daftar
objek X509Certificate
.
Menambahkan konfigurasi nirkabel menggunakan beberapa sertifikat CA
- Verifikasi identitas server:
- Muat sertifikat CA X.509.
- Muat kunci pribadi dan sertifikat klien. Lihat Keamanan dengan HTTPS dan SSL untuk contoh cara membaca file sertifikat.
- Buat
WifiConfiguration
baru, lalu tetapkan SSID dan pengelolaan kuncinya. - Siapkan instance
WifiEnterpriseConfig
padaWifiConfiguration
ini.- Identifikasi server dengan daftar
objek
X509Certificate
menggunakansetCaCertificates()
. - Menetapkan kredensial, identitas, dan sandi klien.
- Tetapkan Extensible Authentication Protocol (EAP) dan metode Fase 2 sebagai bagian dari proses pembuatan koneksi.
- Identifikasi server dengan daftar
objek
- Tambahkan jaringan dengan
WifiManager
. - Aktifkan jaringan. WifiManager otomatis menyimpan konfigurasi selama penyiapan.
Contoh ini menghubungkan langkah-langkah tersebut:
Kotlin
// Verify the server's identity val caCert0 = getCaCert("cert0.crt") val caCert1 = getCaCert("cert1.crt") val clientKey = getClientKey() val clientCert = getClientCert() // Create Wi-Fi configuration val wifiConfig = WifiConfiguration().apply { SSID = "mynetwork" allowedKeyManagement.set(KeyMgmt.WPA_EAP) allowedKeyManagement.set(KeyMgmt.IEEE8021X) // Set up Wi-Fi enterprise configuration enterpriseConfig.setCaCertificates(arrayOf<X509Certificate>(caCert0, caCert1)) enterpriseConfig.setClientKeyEntry(clientKey, clientCert) enterpriseConfig.setIdentity("myusername") enterpriseConfig.setEapMethod(Eap.TLS) enterpriseConfig.setPhase2Method(Phase2.NONE) } // Add network val wifiManager = getSystemService(Context.WIFI_SERVICE) as WifiManager val netId = wifiManager.addNetwork(wifiConfig) // Enable network if (netId < 0) { // Error creating new network } else { wifiManager.enableNetwork(netId, true) }
Java
// Verify the server's identity X509Certificate caCert0 = getCaCert("cert0.crt"); X509Certificate caCert1 = getCaCert("cert1.crt"); PrivateKey clientKey = getClientKey(); X509Certificate clientCert = getClientCert(); // Create Wi-Fi configuration WifiConfiguration wifiConfig = new WifiConfiguration(); wifiConfig.SSID = "mynetwork"; wifiConfig.allowedKeyManagement.set(KeyMgmt.WPA_EAP); wifiConfig.allowedKeyManagement.set(KeyMgmt.IEEE8021X); // Set up Wi-Fi enterprise configuration wifiConfig.enterpriseConfig.setCaCertificates(new X509Certificate[] {caCert0, caCert1}); wifiConfig.enterpriseConfig.setClientKeyEntry(clientKey, clientCert); wifiConfig.enterpriseConfig.setIdentity("myusername"); wifiConfig.enterpriseConfig.setEapMethod(Eap.TLS); wifiConfig.enterpriseConfig.setPhase2Method(Phase2.NONE); // Add network WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); int netId = wifiManager.addNetwork(wifiConfig); // Enable network if (netId < 0) { // Error creating new network } else { wifiManager.enableNetwork(netId, true); }
Menentukan telepon terpisah untuk profil kerja
Anda dapat mengizinkan aplikasi telepon terpisah untuk digunakan di profil kerja.
Ini dapat berupa aplikasi telepon itu sendiri, atau aplikasi Voice over IP (VoIP) yang menerapkan
ConnectionService
API untuk backend panggilan. Hal ini memberikan pengalaman panggilan
UI sistem terintegrasi yang sama dengan aplikasi VoIP di profil kerja, sehingga secara efektif menjadikan telepon
kerja sebagai fitur inti. Panggilan masuk ke akun panggilan kerja
dibedakan dari panggilan masuk ke akun panggilan pribadi.
Pengguna dapat memilih untuk melakukan dan menerima panggilan dari telepon kerja yang diizinkan
di akun telepon. Semua panggilan yang dilakukan dari telepon tersebut, atau masuk ke akun
telepon kerja, direkam di penyedia
CallLog
profil kerja. Telepon kerja mempertahankan log panggilan khusus kerja dengan akses hanya ke
kontak kerja. Panggilan tombol sirkuit yang masuk ditangani oleh telepon utama
dan disimpan dalam log panggilan pribadi. Jika profil kerja dihapus, log panggilan
yang terkait dengan profil kerja tersebut juga akan dihapus, begitu juga dengan semua data profil
kerja.
Aplikasi pihak ketiga harus mengimplementasikan ConnectionService
Aplikasi VoIP pihak ketiga yang perlu melakukan panggilan telepon dan memiliki panggilan tersebut
yang terintegrasi ke dalam aplikasi telepon bawaan dapat mengimplementasikan
ConnectionService
API. Tindakan ini diperlukan untuk layanan VoIP apa pun yang digunakan untuk panggilan kerja. Aplikasi ini
diuntungkan karena panggilannya diperlakukan seperti panggilan seluler tradisional, misalnya, aplikasi akan muncul di telepon sistem bawaan dan log panggilan. Jika
aplikasi yang mengimplementasikan
ConnectionService
diinstal di profil kerja, aplikasi tersebut hanya dapat diakses oleh telepon yang juga
terinstal di profil kerja tersebut.
Setelah developer menerapkan
ConnectionService
,
mereka harus menambahkannya ke file manifes aplikasi dan mendaftarkan
PhoneAccount
dengan
TelecomManager
.
Akun telepon merepresentasikan metode yang berbeda untuk melakukan atau menerima panggilan telepon,
dan mungkin ada beberapa PhoneAccounts
untuk setiap
ConnectionService
. Setelah akun telepon didaftarkan, pengguna
dapat mengaktifkannya melalui setelan telepon.
Integrasi dan notifikasi UI sistem
UI sistem memberi pengguna pengalaman panggilan yang konsisten dan terintegrasi
untuk aplikasi pihak ketiga yang menggunakan
ConnectionService
API sebagai backend untuk melakukan panggilan. Jika menggunakan aplikasi dalam profil kerja, ikon koper
akan ditampilkan saat panggilan masuk dan di status bar. Aplikasi yang mengimplementasikan
ConnectionService
yang diinstal di profil kerja dapat menggunakan
telepon sistem atau mem-build telepon kerja terpisah. Ini dapat berupa satu aplikasi atau
aplikasi terpisah.
Aplikasi telepon menentukan apakah aplikasi membuat atau menerima panggilan kerja dengan
memeriksa flag
android.telecom.Call.Details.PROPERTY_ENTERPRISE_CALL
.
Jika panggilan tersebut adalah panggilan kerja, telepon akan menunjukkan hal ini kepada pengguna dengan menambahkan
badge kerja (ikon koper):
Kotlin
// Call placed through a work phone account. getCurrentCall() is defined by the // dialer. val call = getCurrentCall() if (call.hasProperty(android.telecom.Call.Details.PROPERTY_ENTERPRISE_CALL)) { // Set briefcase icon }
Java
// Call placed through a work phone account. getCurrentCall() is defined by the // dialer. Call call = getCurrentCall(); if (call.hasProperty(android.telecom.Call.Details.PROPERTY_ENTERPRISE_CALL)) { // Set briefcase icon }