ネットワーキングとテレフォニー

このガイドの機能は、ネットワーキングとテレフォニーの管理について説明します。 デバイス ポリシーで実装できる機能を コントローラ(DPC)アプリを介して行います。このドキュメントにはコードが含まれています。 また、Testing DPC アプリを使用して、 Android のエンタープライズ機能のサンプルコードのソース。

DPC アプリは、個人用デバイスまたはデバイス所有者のプロファイル所有者モードで実行できます 有効にする必要があります。この表は、利用できる機能が DPC がプロファイル所有者モードまたはデバイス所有者で実行されている場合に利用可能になる mode:

機能 プロファイル所有者 デバイスの所有者
仕事用連絡先へのアクセス プロファイル間での
仕事用の安全なネットワーク接続
複数の地域にまたがる単一のワイヤレス ネットワーク ID
仕事用プロファイルの個別の電話アプリ

プロファイル間で仕事用連絡先にアクセスする

EMM では、ユーザーの個人用プロファイルに仕事用の連絡先へのアクセスを許可することで、 ローカル検索を使用して、ユーザーの個人用と仕事用の連絡先にアクセスできます。 リモートディレクトリ検索です個人用デバイスでは、個人用の電話アプリ 1 つが プロフィールでは、仕事だけでなく、個人用と通話の発着信を行えます。また 仕事の連絡先がシステム UI に緊密に統合されています。仕事用プロファイルが 暗号化されていると、個人用プロファイルでそのデータを使用することはできません。

システム UI との統合

システム UI では、仕事の着信がブリーフケース アイコンで表示されます。「 callLog には次の情報も表示されます。 仕事の着信と発信のアイコンが表示されます。個人用電話アプリ 連絡先アプリで、リモコンを使って仕事用連絡先の発信者番号を ディレクトリを検索できるため、連絡先が ローカル デバイスにします。メッセージ アプリでは、ローカルの発信者番号通知と検索ができます。

Android 互換性定義 ドキュメント(CDD)に要件が含まれている 仕事用の連絡先をデフォルトの電話アプリに表示するための要件と、 連絡先とメッセージ アプリには、出社したことを示すバッジが表示されます 選択します。

仕事用の連絡先へのアクセスと検索が可能です

ユーザーは個人用プロファイルから仕事用の連絡先にアクセスして電話をかけることができます。 電話アプリの検索画面に表示されます。職場の検索が可能 連絡先(予測入力を使用して、デバイスにローカルで同期され、 認証情報を取得できます。

プライマリ プロファイルの仕事用連絡先を管理する

DPC は仕事用の連絡先を検索する権限を管理します。プロファイル オーナーで実行 モードの場合、DPC は個人用プロファイルの仕事用連絡先の公開設定を管理します。 詳細については、デバイス ポリシーを作成する あります

個人用プロファイルでの仕事用の連絡先の検索はデフォルトで有効になっています。

仕事用のトラフィックに安全なネットワーク接続を確保する

デバイス ポリシーをデバイス所有者モードまたはプロファイル所有者モードで実行する コントローラは、常時接続のバーチャル プライベート ネットワーク(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 向けエンタープライズ ソリューションを使用する組織が設定します。

  1. 以下を実装する VPN アプリをインストールする。 VpnService。 一致するインテント フィルタを使用すると、アクティブな VPN サービスを見つけることができます。 アクション VpnService.SERVICE_INTERFACE
  2. Deployment の VpnService 権限によって保護されているアプリのマニフェスト内 BIND_VPN_SERVICE
  3. 構成する VpnService システムによって起動されます。VPN アプリが自動的に起動するように設定するのは避けます。 システム起動をリッスンし 自身のライフサイクルも制御します
  4. [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 証明書を使用してワイヤレス設定を追加する

  1. サーバーの ID を確認します。 <ph type="x-smartling-placeholder">
      </ph>
    1. X.509 CA 証明書を読み込みます。
    2. クライアントの秘密鍵と証明書を読み込みます。証明書ファイルを読み取る方法の例については、HTTPS と SSL を使用したセキュリティをご覧ください。
  2. 新規作成 WifiConfiguration SSID と鍵管理を設定します。
  3. セットアップする WifiEnterpriseConfig この WifiConfiguration のインスタンスです。
    1. リストでサーバーを特定します。 X509Certificate オブジェクトの setCaCertificates()
    2. クライアント認証情報、ID、パスワードを設定します。
    3. 拡張認証プロトコル(EAP)とフェーズ 2 の方式を次のように設定します。 接続の確立の一部になります
  4. ネットワークを WifiManager
  5. ネットワークを有効にします。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
}