Fitur dalam panduan ini menjelaskan pengelolaan jaringan dan telepon yang dapat Anda terapkan dalam kebijakan perangkat pengontrol (DPC). Dokumen ini berisi kode sampel dan Anda juga dapat menggunakan metode Test DPC sebagai sumber kode contoh untuk fitur perusahaan Android.
Aplikasi DPC dapat berjalan dalam mode pemilik profil di perangkat pribadi atau di pemilik perangkat pada perangkat terkelola sepenuhnya. Tabel ini menunjukkan fitur mana yang tersedia jika DPC berjalan dalam mode pemilik profil atau pemilik perangkat mode:
Fitur | Pemilik profil | Pemilik perangkat |
Mengakses kontak kerja di berbagai profil | ✓ | |
Pastikan koneksi jaringan aman untuk traffic kantor | ✓ | ✓ |
Siapkan satu ID jaringan nirkabel di seluruh region | ✓ | ✓ |
Tentukan telepon terpisah untuk profil kerja | ✓ |
Mengakses kontak kerja di seluruh profil
EMM dapat mengizinkan profil pribadi pengguna mengakses kontak kerja mereka sehingga kontak pribadi dan kerja pengguna dapat diakses melalui pencarian lokal dan pencarian direktori jarak jauh. Pada perangkat pribadi, satu telepon di dapat melakukan dan menerima panggilan pribadi serta panggilan kerja. Selain itu, kontak kerja terintegrasi dengan baik ke dalam UI sistem. Jika profil kerja terenkripsi, datanya tidak tersedia untuk profil pribadi.
Terintegrasi dengan UI sistem
UI sistem menunjukkan panggilan kerja masuk menggunakan ikon koper. Tujuan
callLog
juga menunjukkan
ikon untuk menetapkan panggilan masuk dan keluar. Telepon pribadi dan
aplikasi kontak dapat menampilkan informasi ID penelepon kontak kerja menggunakan remote
pencarian direktori, jadi tidak harus kontak yang sudah disinkronkan di
perangkat lokal. Aplikasi pesan dapat melakukan penelusuran dan ID penelepon lokal.
Definisi Kompatibilitas Android Dokumen (CDD) mencakup persyaratan agar kontak bisnis ditampilkan di telepon default, dan persyaratan yang kontak dan aplikasi pesan diberi badge untuk menunjukkan bahwa mereka berasal dari kantor untuk profil.
Kontak kerja dapat diakses dan ditelusuri
Pengguna dapat mengakses dan menelepon kontak kerja dari profil pribadinya, yang ditampilkan di layar penelusuran aplikasi telepon. Pengguna dapat mencari pekerjaan kontak—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 di pemilik profil DPC mengelola visibilitas kontak kerja di profil pribadi. Untuk informasi selengkapnya, lihat Membuat kebijakan perangkat pengontrol.
Penelusuran kontak kerja menurut profil pribadi diaktifkan secara default.
Untuk melihat cara kebijakan disetel, gunakan
DevicePolicyManager.getCrossProfileContactsSearchDisabled()
.Untuk mengaktifkan atau menonaktifkan penelusuran kontak kerja berdasarkan profil pribadi, gunakan
DevicePolicyManager.setCrossProfileContactsSearchDisabled()
.
Memastikan koneksi jaringan yang aman untuk traffic kantor
Berjalan dalam mode pemilik perangkat atau mode pemilik profil, sebuah kebijakan perangkat dapat menggunakan koneksi {i>Virtual Private Network<i} (VPN) yang selalu aktif untuk memaksa aplikasi untuk meneruskan traffic melalui aplikasi VPN tertentu yang tidak dapat diabaikan. Dengan menggunakan koneksi VPN yang selalu aktif, DPC dapat memastikan bahwa jaringan traffic dari profil kerja atau perangkat terkelola yang melewati layanan VPN, dan tanpa intervensi pengguna. Proses ini membuat koneksi jaringan yang aman untuk traffic berkelanjutan di dalam profil kerja.
Tentang koneksi VPN yang selalu aktif
Sebagai bagian dari kerangka kerja sistem, perutean VPN otomatis dikelola sehingga
pengguna tidak dapat mengabaikan layanan VPN. Jika layanan VPN terputus saat berada
mode kunci total, lalu lintas data tidak
dapat membocorkan ke Internet terbuka. Untuk aplikasi
menerapkan
VpnService
,
VPN yang selalu aktif menyediakan kerangka kerja untuk
mengelola koneksi VPN yang aman melalui
server yang dapat dipercaya
dan menjaganya. Layanan VPN akan otomatis memulai ulang
di seluruh update aplikasi, terlepas dari apakah koneksinya 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 milik perusahaan, pengguna tidak perlu mengonfirmasi dialog izin untuk VPN dalam mode selalu aktif. Setelan jaringan VPN pengguna memungkinkan untuk mengaktifkan koneksi selalu aktif 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 bisa menemukan layanan VPN aktif dengan menggunakan filter intent yang cocok dengan aksiVpnService.SERVICE_INTERFACE
. - Mendeklarasikan
VpnService
dalam manifes aplikasi yang dilindungi oleh izinBIND_VPN_SERVICE
. - Konfigurasikan
VpnService
jadi dimulai oleh sistem. Hindari menyetel aplikasi VPN untuk memulai sendiri mendengarkan {i>booting<i} sistem dan mengendalikan siklus hidupnya sendiri. - Tetapkan status terkelola konfigurasi 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
menelepon
DevicePolicyManager.setAlwaysOnVpnPackage()
.
Koneksi ini akan otomatis diberikan dan tetap ada setelah reboot. Jika
lockdownEnabled
salah, traffic jaringan mungkin tidak aman sejak
ponsel dimulai ulang dan VPN terhubung. Hal ini berguna jika
Anda tidak ingin berhenti
konektivitas jaringan setiap kali VPN gagal, atau jika VPN tidak penting.
Memverifikasi koneksi VPN yang selalu aktif
DPC dapat membaca nama paket yang mengelola VPN yang selalu aktif
koneksi untuk pengguna saat ini,
DevicePolicyManager.getAlwaysOnVpnPackage().
Jika tidak ada paket seperti itu, atau VPN dibuat di dalam Setelan sistem
aplikasi, null
akan ditampilkan.
Contoh
Di aplikasi TestDPC, AlwaysOnVpnFragment.java
menggunakan API ini untuk mengaktifkan setelan untuk koneksi VPN yang selalu aktif.
Dalam contoh berikut:
- Properti terkelola
konfigurasi
Layanan VPN diatur oleh
DevicePolicyManager
menggunakansetApplicationRestrictions()
. - Konfigurasi terkelola menggunakan key-value pair arbitrer dan aplikasi contoh ini menggunakannya di tempat lain untuk mengonfigurasi setelan jaringan VPN (lihat Periksa Konfigurasi Terkelola).
- Contoh ini menambahkan penginstal paket Android ke daftar tolak sehingga tidak memperbarui paket sistem melalui VPN. Semua lalu lintas jaringan pengguna dalam profil kerja atau perangkat melewati aplikasi VPN ini, kecuali paket penginstal; pembaruannya 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(...); }
Menyiapkan satu ID jaringan nirkabel di seluruh region
Berjalan dalam mode pemilik perangkat atau mode pemilik profil, sebuah kebijakan perangkat pengontrol (DPC) dapat mengaitkan beberapa sertifikat certificate authority (CA) dengan konfigurasi jaringan nirkabel tunggal. Dengan konfigurasi ini, sebuah perangkat dapat tersambung ke titik akses nirkabel yang memiliki nama jaringan yang sama, atau {i>service set identifier<i} (SSID), tetapi dikonfigurasi dengan CA yang berbeda CA {i>root<i}. Hal ini berguna jika jaringan nirkabel organisasi Anda yang terletak di beberapa wilayah geografis, dan setiap wilayah memerlukan {i>certificate authority<i}. Misalnya, tanda tangan resmi dapat memerlukan otoritas yang membutuhkan 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
di suatu titik akses, terlepas dari region mereka.
Menentukan sertifikat CA untuk mengidentifikasi server
Untuk menentukan daftar sertifikat X.509 yang mengidentifikasi server yang menggunakan sertifikat
SSID, 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 ditetapkan secara otomatis ke sertifikat dan digunakan dalam
konfigurasi Anda. Tujuan
WifiManager
menginstal sertifikat dan secara otomatis
menyimpan konfigurasi ketika
jaringan diaktifkan, dan menghapus sertifikat saat konfigurasi
dihapus.
Untuk mendapatkan semua sertifikat CA yang terkait dengan konfigurasi nirkabel, gunakan
WifiEnterpriseConfig.getCaCertificates()
untuk menampilkan daftar
X509Certificate
objek.
Menambahkan konfigurasi nirkabel menggunakan beberapa sertifikat CA
- Memverifikasi identitas server:
- Muat sertifikat CA X.509.
- Muat kunci pribadi dan sertifikat klien. Lihat Keamanan dengan HTTPS dan SSL untuk mengetahui contoh cara membaca file sertifikat.
- Buat baru
WifiConfiguration
dan mengatur SSID dan pengelolaan kuncinya. - Siapkan
WifiEnterpriseConfig
instance padaWifiConfiguration
ini.- Identifikasi server dengan daftar
X509Certificate
objek menggunakansetCaCertificates()
. - Tetapkan kredensial, identitas, dan sandi klien.
- Tetapkan metode Protokol Autentikasi yang Dapat Diperluas (EAP) dan Tahap 2 sebagai ketika Anda membuat koneksi.
- Identifikasi server dengan daftar
- Tambahkan jaringan dengan
WifiManager
. - Mengaktifkan jaringan. WifiManager otomatis menyimpan konfigurasi selama penyiapan.
Contoh ini menggabungkan 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 bisa berupa telepon itu sendiri, atau aplikasi Voice over IP (VoIP) yang mengimplementasikan
ConnectionService
API untuk backend panggilan. Ini menyediakan panggilan UI sistem terintegrasi yang sama
aplikasi VoIP di profil kerja, yang secara efektif membuat pekerjaan
dialer 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
pada akun ponsel. Semua panggilan yang dilakukan dari telepon tersebut, atau yang masuk ke kantor
akun telepon, dicatat dalam akun profil kerja
CallLog
penyedia layanan. Telepon kerja menyimpan log panggilan khusus kerja dengan akses hanya ke
kontak di kantor. Panggilan sakelar sirkuit masuk ditangani oleh pemanggil 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 profil kerja
layanan otomatis dan data skalabel.
Aplikasi pihak ketiga harus mengimplementasikan ConnectionService
Aplikasi VoIP pihak ketiga yang perlu melakukan panggilan telepon dan menerima panggilan tersebut
yang terintegrasi ke dalam aplikasi telepon bawaan,
dapat mengimplementasikan
ConnectionService
Compute Engine API. Izin ini diperlukan untuk layanan VoIP apa pun yang digunakan untuk panggilan kantor. Aplikasi ini
mendapat manfaat dengan menjadikan panggilan
mereka diperlakukan seperti panggilan seluler tradisional,
misalnya, mereka muncul di telepon sistem
bawaan dan log panggilan. Jika
penerapan aplikasi
ConnectionService
diinstal di profil kerja, itu hanya dapat diakses oleh pemanggil juga
yang diinstal di profil kerja tersebut.
Setelah developer menerapkan
ConnectionService
,
mereka harus menambahkannya ke file manifes aplikasi dan mendaftarkan
PhoneAccount
dengan
TelecomManager
.
Akun telepon mewakili metode yang berbeda untuk melakukan atau menerima panggilan telepon,
dan bisa terdapat beberapa PhoneAccounts
untuk masing-masing
ConnectionService
. Setelah akun ponsel didaftarkan, pengguna
dapat mengaktifkannya
melalui pengaturan telepon.
Integrasi dan notifikasi UI sistem
UI sistem memberikan pengalaman panggilan yang konsisten dan terintegrasi kepada pengguna
untuk aplikasi pihak ketiga yang menggunakan
ConnectionService
API sebagai backend untuk melakukan panggilan. Jika menggunakan aplikasi di profil kerja, koper
ditampilkan pada panggilan
masuk dan di bilah status. Aplikasi yang mengimplementasikan
ConnectionService
yang diinstal di profil kerja dapat menggunakan
{i>system dialer<i} atau membuat telepon
kerja yang terpisah. Ini dapat berupa
satu aplikasi atau
aplikasi terpisah.
Aplikasi telepon menentukan apakah aplikasi melakukan atau menerima telepon kerja dengan
memeriksa tanda
android.telecom.Call.Details.PROPERTY_ENTERPRISE_CALL
.
Jika merupakan panggilan kerja, pemanggil akan menunjukkannya kepada pengguna dengan menambahkan
lencana 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 }