Jaringan dan telepon

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.

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.

  1. Instal aplikasi VPN yang mengimplementasikan VpnService. Anda bisa menemukan layanan VPN aktif dengan menggunakan filter intent yang cocok dengan aksi VpnService.SERVICE_INTERFACE.
  2. Mendeklarasikan VpnService dalam manifes aplikasi yang dilindungi oleh izin BIND_VPN_SERVICE.
  3. Konfigurasikan VpnService jadi dimulai oleh sistem. Hindari menyetel aplikasi VPN untuk memulai sendiri mendengarkan {i>booting<i} sistem dan mengendalikan siklus hidupnya sendiri.
  4. 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 menggunakan setApplicationRestrictions() .
  • 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 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(...);
}

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

  1. Memverifikasi identitas server:
    1. Muat sertifikat CA X.509.
    2. Muat kunci pribadi dan sertifikat klien. Lihat Keamanan dengan HTTPS dan SSL untuk mengetahui contoh cara membaca file sertifikat.
  2. Buat baru WifiConfiguration dan mengatur SSID dan pengelolaan kuncinya.
  3. Siapkan WifiEnterpriseConfig instance pada WifiConfiguration ini.
    1. Identifikasi server dengan daftar X509Certificate objek menggunakan setCaCertificates().
    2. Tetapkan kredensial, identitas, dan sandi klien.
    3. Tetapkan metode Protokol Autentikasi yang Dapat Diperluas (EAP) dan Tahap 2 sebagai ketika Anda membuat koneksi.
  4. Tambahkan jaringan dengan WifiManager.
  5. 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
}