이 가이드의 기능은 네트워킹 및 전화 통신 관리를 설명합니다. 기기 정책에서 구현할 수 있는 기능 컨트롤러 (DPC) 앱을 사용해 보세요. 문서에 코드가 포함되어 있습니다. 샘플 코드를 생성할 수 있으며 Test DPC 앱을 샘플 코드 소스를 제공합니다.
DPC 앱은 개인 기기의 프로필 소유자 모드 또는 기기 소유자에서 실행할 수 있습니다. 완전 관리형 기기에서 사용할 수 있습니다 이 표는 여러분이 사용할 수 있는 DPC가 프로필 소유자 모드 또는 기기 소유자로 실행될 때 사용 가능 모드로 전환할 수 있습니다.
기능 | 프로필 소유자 | 기기 소유자 |
직장 연락처에 액세스 프로필 전반에서 | ✓ | |
직장 트래픽을 위한 안전한 네트워크 연결 | ✓ | ✓ |
설정 여러 리전에 걸친 단일 무선 네트워크 ID | ✓ | ✓ |
직장 프로필용 별도의 다이얼러 | ✓ |
여러 프로필에서 직장 연락처에 액세스
EMM을 사용하면 사용자의 개인 프로필이 직장 연락처에 액세스하도록 허용하여 지역 검색 및 검색을 통해 사용자의 개인 및 직장 연락처에 원격 디렉터리 조회입니다. 개인 기기에서는 개인용 개인 통화와 업무 전화를 주고받을 수 있습니다. 또한 직장 연락처는 시스템 UI에 잘 통합되어 있습니다. 직장 프로필이 다음과 같은 경우 개인 프로필에서 해당 데이터를 사용할 수 없습니다.
시스템 UI와 통합
시스템 UI가 서류 가방 아이콘을 사용하여 수신되는 업무 전화를 나타냅니다. 이
callLog
는 다음 항목도 표시합니다.
아이콘을 클릭하여 수신 및 발신 업무 전화를 지정합니다. 개인 다이얼러 및
주소록 앱은 리모컨을 사용하여 직장 연락처의 발신번호 표시 정보를
디렉토리 조회가 지원되므로 연락처가 이미
로컬 기기입니다. 메시지 앱에서는 지역 발신번호 표시 및 검색이 가능합니다.
Android 호환성 정의 문서 (CDD)에 요구사항이 포함됨 기본 다이얼러에 직장 연락처를 표시할 수 있으며 연락처 및 메시지 앱에 출근임을 나타내는 배지가 표시됩니다. 확인할 수 있습니다.
직장 연락처에 액세스하고 검색할 수 있습니다.
사용자는 개인 프로필에서 직장 연락처에 액세스하고 전화를 걸 수 있습니다. 다이얼러 앱의 검색 화면에 표시됩니다. 사용자가 과제물을 검색할 수 있습니다. 자동 완성을 사용하여 기기에 로컬로 동기화되고 표시된 연락처 정보를 제공합니다.
기본 프로필의 직장 연락처 관리
DPC는 직장 연락처를 검색하는 권한을 제어합니다. 프로필 소유자에서 실행 중 모드에서 DPC는 개인 프로필에서 직장 연락처의 공개 상태를 관리합니다. 자세한 내용은 기기 정책 구축을 참고하세요. 컨트롤러입니다.
개인 프로필로 직장 연락처 검색은 기본적으로 사용 설정되어 있습니다.
정책이 어떻게 설정되었는지 확인하려면 다음을 사용하세요.
DevicePolicyManager.getCrossProfileContactsSearchDisabled()
개인 프로필로 직장 연락처 검색을 사용 또는 사용 중지하려면 다음을 사용합니다.
DevicePolicyManager.setCrossProfileContactsSearchDisabled()
직장 트래픽을 위한 보안 네트워크 연결 확인하기
기기 소유자 모드 또는 프로필 소유자 모드로 실행 시 기기 정책 컨트롤러는 항상 켜져 있는 가상 사설망 (VPN) 연결을 사용하여 애플리케이션이 네트워크에 연결할 수 없는 지정된 VPN 앱을 통해 트래픽을 있습니다. DPC는 상시 사용 설정 VPN 연결을 사용하여 네트워크 간에 직장 프로필 또는 관리 기기의 트래픽이 VPN 서비스를 통과합니다. 방법을 파악할 수 있습니다 이 프로세스는 직장 프로필 내에서 지속적인 트래픽을 허용합니다.
연결 유지 VPN 연결 정보
시스템 프레임워크의 일부로 VPN 라우팅이 자동으로 관리되므로
VPN 서비스를 우회할 수 없습니다. 내부에 있는 동안 VPN 서비스의 연결이 해제되는 경우
개방된 인터넷에 트래픽이 유출되지 않도록 하기 위한 것입니다. 애플리케이션
구현
VpnService
,
상시 사용 설정 VPN은 다음을 통해 보안 VPN 연결을 관리하기 위한 프레임워크를 제공합니다.
계속 유지하게 됩니다. VPN 서비스는
앱 업데이트에 걸친
셀룰러 데이터입니다. 기기가 재부팅되면 프레임워크는 VPN 연결을 다시 시작합니다.
VPN 서비스에 대한 연결은 사용자에게 투명합니다. 회사 소유 기기의 경우 사용자는 연결 유지 모드의 VPN 사용자의 VPN 네트워크 설정을 통해 상시 연결 유지를 수동으로 해야 할 수도 있습니다.
DISALLOW_CONFIG_VPN
인 경우
true
인 경우 사용자는 VPN을 구성할 수 없습니다. 사용
DISALLOW_DEBUGGING_FEATURES
을 사용하여 사용자가 adb 디버그 명령어를 사용하여 상시 사용 설정 VPN을 재정의하지 못하도록 제한하세요.
사용자가 VPN을 제거하지 못하게 하려면 다음을 호출합니다.
DevicePolicyManager.setUninstallBlocked
VPN 서비스 설정
Android용 엔터프라이즈 솔루션을 사용하는 조직에서 VPN을 설정합니다.
- 다음을 구현하는 VPN 앱 설치
VpnService
활성 VPN 서비스를 찾으려면 액션VpnService.SERVICE_INTERFACE
-
VpnService
권한으로 보호되는 앱의 매니페스트에서BIND_VPN_SERVICE
입니다. - 구성:
VpnService
시스템에서 시작합니다 VPN 앱이 다음과 같이 자체적으로 시작하도록 설정하지 마세요. 시스템 부팅을 수신 대기하고 자체 수명 주기를 제어합니다. - 관리형 인스턴스 구성에 대해 VPN 앱 (아래 예 참고)에 연결할 수 있습니다.
연결 유지 VPN 연결 사용 설정
DPC는 다음과 같은 방법으로 특정 앱을 통해 상시 사용 설정 VPN 연결을 구성할 수 있습니다.
통화
DevicePolicyManager.setAlwaysOnVpnPackage()
이 연결은 자동으로 부여되며 재부팅 후에도 지속됩니다. 만약
lockdownEnabled
가 false이면
재부팅되고 VPN이 연결됩니다. 이 기능은
네트워크 연결을 재개할 수 있다는 것을 의미합니다.
연결 유지 VPN 연결 확인하기
DPC는 연결 유지 VPN을 관리하는 패키지의 이름을 읽을 수 있습니다.
현재 사용자와의 연결을
DevicePolicyManager.getAlwaysOnVpnPackage().
이러한 패키지가 없거나 VPN이 시스템 설정에서 생성된 경우
null
가 반환됩니다.
예
TestDPC 앱에서 AlwaysOnVpnFragment.java
는 이러한 API를 사용하여 상시 사용 설정 VPN 연결을 위한 설정을 사용 설정합니다.
아래 예의 경우:
- 관리형
구성의
VPN 서비스는
<ph type="x-smartling-placeholder">
DevicePolicyManager
</ph> 사용하여setApplicationRestrictions()
메서드를 사용하여 축소하도록 요청합니다. - 관리 구성은 임의의 키-값 쌍을 사용하는 예시 앱 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() }
자바
// 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로 구성됨 있습니다 이 기능은 조직의 무선 네트워크가 여러 지리적 리전에 걸쳐 있으며 각 리전마다 확인할 수 있습니다 예를 들어 법적 서명에는 현지 지역 CA가 필요한 기관을 요청할 수 있습니다
참고: Android는
<ph type="x-smartling-placeholder">setCaCertificate
</ph>
API 18 (Jelly Bean)부터 사용 가능하지만 IT 관리자가 네트워크를 프로비저닝해야 함
기기가 각 CA에서 원활하게 인증되도록 하기 위해
모든 VPC 네트워크에 연결할 수 있습니다
서버 식별을 위한 CA 인증서 지정
동일한
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) }
자바
// 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); }
직장 프로필용 별도의 다이얼러 지정
직장 프로필에서 사용할 별도의 다이얼러 애플리케이션을 허용 목록에 추가할 수 있습니다.
다이얼러 자체일 수도 있고,
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 }