このガイドの機能は、ネットワーキングとテレフォニーの管理について説明します。 デバイス ポリシーで実装できる機能を コントローラ(DPC)アプリを介して行います。このドキュメントにはコードが含まれています。 また、Testing DPC アプリを使用して、 Android のエンタープライズ機能のサンプルコードのソース。
DPC アプリは、個人��デバイスまたはデバイス所有者のプロファイル所有者モードで実行できます 有効にする必要があります。この表は、利用できる機能が DPC がプロファイル所有者モードまたはデバイス所有者で実行されている場合に利用可能になる mode:
機能 | プロファイル所有者 | デバイスの所有者 |
仕事用連絡先へのアクセス プロファイル間での | ✓ | |
仕事用の安全なネットワーク接続 | ✓ | ✓ |
複数の地域にまたがる単一のワイヤレス ネットワーク ID | ✓ | ✓ |
仕事用プロファイルの個別の電話アプリ | ✓ |
プロファイル間で仕事用連絡先にアクセスする
EMM では、ユーザーの個人用プロファイルに仕事用の連絡先へのアクセスを許可することで、 ローカル検索を使用して、ユーザーの個人用と仕事用の連絡先にアクセスできます。 リモートディレクトリ検索です個人用デバイスでは、個人用の電話アプリ 1 つが プロフィールでは、仕事だけでなく、個人用と通話の発着信を行えます。また 仕事の連絡先がシステム UI に緊密に統合されています。仕事用プロファイルが 暗号化されていると、個人用プロファイルでそのデータを使用することはできません。
システム UI との統合
システム UI では、仕事の着信がブリーフケース アイコンで表示されます。「
callLog
には次の情報も表示されます。
仕事の着信と発信のアイコンが表示されます。個人用電話アプリ
連絡先アプリで、リモコンを使って仕事用連絡先の発信者番号を
ディレクトリを検索できるため、連絡先が
ローカル デバイスにします。メッセージ アプリでは、ローカルの発信者番号通知と検索ができます。
Android 互換性定義 ドキュメント(CDD)に要件が含まれてい��� 仕事用の連絡先���デ����ルトの電話アプリに表示するための要件と、 連絡先とメッセージ アプリには、出社したことを示すバッジが表示されます 選択します。
仕事用の連絡先へのアクセスと検索が可能です
ユーザーは個人用プロファイルから仕事用の連絡先にアクセスして電話をかけることができます。 電話アプリの検索画面に表示されます。職場の検索が可能 連絡先(予測入力を使用して、デバイスにローカルで同期され、 認証情報を取得できます。
プライマリ プロファイルの仕事用連絡先を管理する
DPC は仕事用の連絡先を検索する権限を管理します。プロファイル オーナーで実行 モードの場合、DPC は個人用プロファイルの仕事用連絡先の公開設定を管理します。 詳細については、デバイス ポリシーを作成する あります。
個人用プロファイルでの仕事用の連絡先の検索はデフォルトで有効になっています。
このポリシーの設定を確認するには、次のコマンドを使用します。
DevicePolicyManager.getCrossProfileContactsSearchDisabled()
。個人用プロファイルで仕事用の連絡先の検索を有効または無効にするには、次のコマンドを使用します。
DevicePolicyManager.setCrossProfileContactsSearchDisabled()
。
仕事用のトラフィックに安全なネットワーク接続を確保する
デバイス ポリシーをデバイス所有者モードまたはプロファイル所有者モードで実行する コントローラは、常時接続のバーチャル プライベート ネットワーク(VPN)接続を使用して、 指定された VPN アプリを経由して、 バイパスされます。常時接続の VPN 接続を使用することで、DPC は 仕事用プロファイルまたは管理対象デバイスからのトラフィックが VPN サービスを通過する 実行できます。このプロセスにより、サービス アカウントに対する トラフィックを継続的に管理できます。
常時接続 VPN 接続について
VPN ルーティングはシステム フレームワークの一部として自動的に管理されるため、
VPN サービスをバイパスできません。接続中に VPN サービスが切断された場合
トラフィックがオープン インターネットに漏洩することはありません。アプリケーション
実装
VpnService
,
常時接続 VPN は、Google Cloud VPN を介して安全な VPN 接続を
維持することですVPN サービスは VPN トンネルを自動的に
接続が Wi-Fi 経由���������������らず、アプリ アップデートを
ありますデバイスが再起動すると、フレームワークは VPN 接続を再開します。
VPN サービスへの接続は、ユーザーが意識することはありません。1 つの ユーザーが会社所有デバイスの場合、同意ダイアログに 常時接続モードの VPNユーザーの VPN ネットワーク設定では、 手動で接続することもできます。
DISALLOW_CONFIG_VPN
の場合
true
の場合、ユーザーは VPN を構成できません。有効にする
DISALLOW_DEBUGGING_FEATURES
adb デバッグ コマンドを使用して、常時接続 VPN をオーバーライドするのを制限する。
ユーザーが VPN をアンインストールできないようにするには、
DevicePolicyManager.setUninstallBlocked
。
VPN サービスを設定する
VPN の設定は、Android 向けエンタープライズ ソリューションを使用する組織が設定します。
- 以下を実装する VPN アプリをインストールする。
VpnService
。 一致するインテント フィルタを使用すると、アクティブな VPN サービスを見つけることができます。 アクションVpnService.SERVICE_INTERFACE
。 - Deployment の
VpnService
権限によって保護されているアプリのマニフェスト内BIND_VPN_SERVICE
。 - 構成する
VpnService
システムによって起動されます。VPN アプリが自動的に起動するように設定するのは避けます。 システム起動をリッスンし 自身のライフサイクルも制御します - [Managed 構成 必要があります(下記の例を参照)。
常時接続 VPN 接続を有効にする
DPC は、次の方法で特定のアプリを介した常時接続 VPN 接続を構成できます。
通話中
DevicePolicyManager.setAlwaysOnVpnPackage()
。
この接続は自動的に付与され、再起動後も維持されます。条件
lockdownEnabled
が false の場合、ネットワーク トラフィックが
スマート���ォンが再起動して VPN が接続されますこれは、処理を中断せずに
VPN で障害が発生した場合、または VPN が必須ではない場合に、自動的にネットワーク接続を提供します。
常時接続 VPN 接続を確認する
DPC は、常時接続 VPN を管理するパッケージの名前を読み取ることができます。
現在のユーザーの接続を
DevicePolicyManager.getAlwaysOnVpnPackage().
該当するパッケージがない場合、またはシステムの設定内に VPN が作成された場合
null
が返されます。
例
TestDPC アプリで、AlwaysOnVpnFragment.java
はこれらの API を使用して、常時接続 VPN 接続の設定を有効にします。
下の例からは以下の情報を読み取ることができます。
- マネージド サービス
構成
によって設定されます。
DevicePolicyManager
使用します。setApplicationRestrictions()
メソッドを呼び出します。 - 管理対象構成では、任意の Key-Value ペアとこのサンプルアプリを使用する 別の場所で使用し、VPN のネットワークの設定を行います( 管理対象設定を確認するを参照)。
- この例では、Android パッケージ インストーラを拒否リストに追加しているため、 VPN 経由でシステム・パッケージをアップデートできます。ネットワーク内のユーザーのネットワーク トラフィックは、 仕事用プロファイルまたはデバイスは、この VPN アプリを通過します。ただし、 インストーラ更新にはオープン インターネットが使用されます。
- その後、
DevicePolicyManager
が VPN 接続の常時接続を有効にします。 VPN パッケージを使用するsetAlwaysOnVpnPackage()
, ロックダウンモードを有効にします
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(...); }
地域間で単一のワイヤレス ネットワーク ID を設定する
デバイス ポリシーをデバイス所有者モードまたはプロファイル所有者モードで実行する コントローラ(DPC)は複数の認証局(CA)証明書を関連付けることができる ワイヤレス ネットワーク設定を一本化します。この設定では、デバイスは 同じネットワーク名のワイヤレス アクセス ポイントに接続できる サービスセット識別子(SSID)だが、異なる CA で構成されている 提供します。これは、組織のワイヤレス ネットワークが 複数の地理的リージョンに分散している場合、各リージョンにはそれぞれ異なる できます。たとえば、法的署名には現地での署名を 作成する必要があります。
注: Android は、
setCaCertificate
API 18(Jelly Bean)以降ですが、IT 管理者はネットワークをプロビジョニングする必要があります。
を CA ごとに個別に実装することで、デバイス間でのシームレスな認証を
アクセスポイントに接続できます
CA 証明書を指定してサーバーを識別
同じ X.509 証明書を使用してサーバーを識別する X.509 証明書のリストを指定するには、
SSID(WifiEnterpriseConfig.setCaCertificates()
を使用するワイヤレス設定に、関連するすべての CA を含めます)。
サーバーの証明書は、CA が指定された証明書のいずれかと一致する場合に有効です。
デフォルト名は自動的に証明書に割り当てられ、
できます。「
WifiManager
証明書がインストールされ、アプリケーションの起動時に
構成が有効になり、構成が有効になると、証明書が削除されます。
削除されました。
ワイヤレス設定に関連付けられているすべての CA 証明書を取得するには、次のコマンドを使用します。
WifiEnterpriseConfig.getCaCertificates()
: 次のリストを返す
X509Certificate
オブジェクト。
複数��� CA 証明書を使用してワイヤレス設定を追加する
- サーバーの ID を確認します。
<ph type="x-smartling-placeholder">
- </ph>
- X.509 CA 証明書を読み込みます。
- クライアントの秘密鍵と証明書を読み込みます。証明書ファイルを読み取る方法の例については、HTTPS と SSL を使用したセキュリティをご覧ください。
- 新規作成
WifiConfiguration
SSID と鍵管理を設定します。 - セットアップする
WifiEnterpriseConfig
このWifiConfiguration
のインスタンスです。- リストでサーバーを特定します。
X509Certificate
オブジェクトのsetCaCertificates()
。 - クライアント認証情報、ID、パスワードを設定します。
- 拡張認証プロトコル(EAP)とフェーズ 2 の方式を次のように設定します。 接続の確立の一部になります
- リストでサーバーを特定します。
- ネットワークを
WifiManager
。 - ネットワークを有効にします。WifiManager は、起動時に設定を自動的に保存します。 できます。
この例ではステップを関連付けています。
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); }
仕事用プロファイル用に別の電話アプリを指定する
仕事用プロファイルで使用する電話アプリを個別に許可リストに登録できます。
電話アプリ自体も、IP アドレスを実装している Voice over IP(VoIP)アプリでもかまいません。
ConnectionService
呼び出し元のバックエンド用の API。これにより、同じ統合システム UI ダイヤルが
VoIP アプリケーションを仕事用プロファイルに実装することで、
電話アプリの中核機能です。仕事用の通話用アカウントへの着信は、
着信と個人の通話アカウントに区別されます。
許可リストに登録されている仕事用電話アプリとの発信と着信を選択できます
スマートフォンアカウント。その���話アプリから発信したすべての通話、または職場に着信したすべての通話
仕事用プロファイルのプロファイルに記録されます。
CallLog
接続します。仕事用電話アプリは仕事専用の通話履歴を保持し、
仕事の連絡先。回線交換通話の着信はメインの電話アプリが処理する
個人の通話履歴にも保存されます仕事用プロファイルが削除されると、通話履歴には
その仕事用プロファイルに関連付けられていたファイルと
すべての仕事用プロファイルも削除されます
分析できます
サードパーティ アプリは ConnectionService を実装する必要があります
電話をかける必要のあるサードパーティの VoIP アプリ
組み込みのスマートフォン アプリに
ConnectionService
API仕事用の通話に使用する VoIP サービスに必要です。これらのアプリ
従来のモバイル通話と同様に扱われて
内蔵システムの電話アプリや通話履歴に表示されますもし
実装する
ConnectionService
仕事用プロファイルにインストールされているため、アクセスできるのは電話アプリのみです。
仕事用プロファイルにインストールできます
デベロッパーが実装を
ConnectionService
,
そのコードをアプリのマニフェスト ファイルに追加して、
PhoneAccount
新しい
TelecomManager
。
スマートフォン アカウントは、電話を発信または受信するための個別の方法を表します。
また、それぞれに複数の PhoneAccounts
を指定できます。
ConnectionService
。スマートフォン アカウントを登録すると、
電話アプリの設定で有効にできます。
システム UI の統合と通知
システム UI により、一貫性のある統合されたダイヤル エクスペリエンスを提供できます。
使用するサードパーティ製アプリについては、
ConnectionService
呼び出しを行うバックエンドとしての API です。仕事用プロファイルでアプリを使用する場合は、
アイコンが着信とステータスバーに表示されます。この実装では、
仕事用プロファイルにインストールされている ConnectionService
は、
仕事用の電話アプリを個別に作成したり、単一のアプリの場合もあれば、
管理できます。
電話アプリでは、仕事の発信元または着信先を
フラグの確認
android.telecom.Call.Details.PROPERTY_ENTERPRISE_CALL
。
電話が仕事の通話の場合、電話アプリでは
社員バッジ(ブリーフケース アイコン):
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 }