Jaringan dan telepon

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.

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.

  1. Instal aplikasi VPN yang mengimplementasikan VpnService. Anda dapat menemukan layanan VPN yang aktif menggunakan filter intent yang cocok dengan tindakan VpnService.SERVICE_INTERFACE.
  2. Deklarasikan VpnService dalam manifes aplikasi yang dilindungi oleh izin BIND_VPN_SERVICE.
  3. Konfigurasikan VpnService agar dimulai oleh sistem. Hindari menyetel aplikasi VPN agar memulai sendiri dengan memproses booting sistem dan mengontrol siklus prosesnya sendiri.
  4. 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 metode setApplicationRestrictions().
  • 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 menggunakan setAlwaysOnVpnPackage(), 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

  1. Verifikasi identitas server:
    1. Muat sertifikat CA X.509.
    2. Muat kunci pribadi dan sertifikat klien. Lihat Keamanan dengan HTTPS dan SSL untuk contoh cara membaca file sertifikat.
  2. Buat WifiConfiguration baru, lalu tetapkan SSID dan pengelolaan kuncinya.
  3. Siapkan instance WifiEnterpriseConfig pada WifiConfiguration ini.
    1. Identifikasi server dengan daftar objek X509Certificate menggunakan setCaCertificates().
    2. Menetapkan kredensial, identitas, dan sandi klien.
    3. Tetapkan Extensible Authentication Protocol (EAP) dan metode Fase 2 sebagai bagian dari proses pembuatan koneksi.
  4. Tambahkan jaringan dengan WifiManager.
  5. 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
}