Mạng và điện thoại

Các tính năng trong hướng dẫn này mô tả những tính năng quản lý mạng và điện thoại mà bạn có thể triển khai trong ứng dụng trình kiểm soát chính sách thiết bị (DPC). Tài liệu này chứa mã mẫu và bạn cũng có thể sử dụng ứng dụng Kiểm thử DPC làm nguồn mã mẫu cho các tính năng của Android dành cho doanh nghiệp.

Ứng dụng DPC có thể chạy ở chế độ chủ sở hữu hồ sơ trên thiết bị cá nhân hoặc ở chế độ chủ sở hữu thiết bị trên các thiết bị được quản lý toàn bộ. Bảng này cho biết những tính năng nào có thể sử dụng khi DPC chạy ở chế độ chủ sở hữu hồ sơ hoặc chế độ chủ sở hữu thiết bị:

Tính năng Chủ sở hữu hồ sơ Chủ sở hữu thiết bị
Truy cập danh bạ công việc trên các hồ sơ
Đảm bảo kết nối mạng bảo mật cho lưu lượng truy cập công việc
Thiết lập một mã mạng không dây duy nhất giữa các khu vực
Chỉ định một trình quay số riêng cho hồ sơ công việc

Truy cập vào danh bạ công việc trên nhiều hồ sơ

EMM có thể cho phép hồ sơ cá nhân của người dùng truy cập vào danh bạ công việc để danh bạ cá nhân và công việc của người dùng có thể truy cập được thông qua tính năng tìm kiếm cục bộ và tra cứu thư mục từ xa. Trên thiết bị cá nhân, một trình quay số trong hồ sơ cá nhân có thể thực hiện và nhận cuộc gọi cá nhân cũng như cuộc gọi về công việc. Ngoài ra, danh bạ công việc cũng được tích hợp tốt vào giao diện người dùng hệ thống. Nếu hồ sơ công việc được mã hoá, thì hồ sơ cá nhân sẽ không có dữ liệu của hồ sơ đó.

Tích hợp với giao diện người dùng hệ thống

Giao diện người dùng hệ thống cho biết có cuộc gọi đến về công việc bằng cách sử dụng biểu tượng cặp tài liệu. callLog cũng hiển thị biểu tượng để chỉ định cuộc gọi đến và đi về công việc. Trình quay số cá nhân và ứng dụng liên hệ có thể hiển thị thông tin nhận dạng người gọi của một liên hệ tại nơi làm việc bằng cách sử dụng tính năng tra cứu thư mục từ xa. Vì vậy, việc liên hệ đó không bắt buộc phải được đồng bộ hoá trên thiết bị cục bộ. Ứng dụng nhắn tin có thể gọi và tìm kiếm tên nhận dạng người gọi cục bộ.

Tài liệu định nghĩa về khả năng tương thích với Android (CDD) bao gồm các yêu cầu để danh bạ công việc hiển thị trong trình quay số mặc định, cũng như các yêu cầu mà danh bạ và ứng dụng nhắn tin được gắn huy hiệu để cho biết rằng họ thuộc hồ sơ công việc.

Danh bạ công việc có thể truy cập và tìm kiếm được

Người dùng có thể truy cập và gọi cho người liên hệ công việc từ hồ sơ cá nhân của họ. Hồ sơ này sẽ hiển thị trên màn hình tìm kiếm của ứng dụng gọi điện. Người dùng có thể tìm danh bạ công việc (bằng cách sử dụng tính năng tự động hoàn thành) được đồng bộ hoá cục bộ trên thiết bị và được liệt kê thông qua hoạt động tra cứu thư mục từ xa.

Kiểm soát thông tin liên hệ công việc trong hồ sơ chính

DPC kiểm soát quyền tìm kiếm danh bạ công việc. Khi chạy ở chế độ chủ sở hữu hồ sơ, DPC quản lý chế độ hiển thị của danh bạ công việc trong hồ sơ cá nhân. Để biết thêm thông tin, hãy xem bài viết Tạo trình kiểm soát chính sách thiết bị.

Tính năng tìm kiếm danh bạ công việc theo hồ sơ cá nhân được bật theo mặc định.

Đảm bảo kết nối mạng an toàn cho lưu lượng truy cập công việc

Khi chạy ở chế độ chủ sở hữu thiết bị hoặc chế độ chủ sở hữu hồ sơ, trình kiểm soát chính sách thiết bị có thể dùng kết nối Mạng riêng ảo (VPN) luôn bật để buộc các ứng dụng truyền lưu lượng truy cập qua một ứng dụng VPN đã chỉ định mà không thể bỏ qua. Khi sử dụng kết nối VPN luôn bật, DPC có thể đảm bảo rằng lưu lượng truy cập mạng từ hồ sơ công việc hoặc thiết bị được quản lý đi qua dịch vụ VPN mà không cần sự can thiệp của người dùng. Quá trình này tạo ra một kết nối mạng an toàn cho lưu lượng truy cập liên tục trong hồ sơ công việc.

Giới thiệu về kết nối VPN luôn bật

Việc định tuyến VPN là một phần của khung hệ thống, được tự động quản lý để người dùng không thể bỏ qua dịch vụ VPN. Nếu dịch vụ VPN bị ngắt kết nối khi ở chế độ khoá, thì lưu lượng truy cập không thể bị rò rỉ ra Internet mở. Đối với các ứng dụng triển khai VpnService, VPN luôn bật cung cấp một khung để quản lý kết nối VPN bảo mật thông qua một máy chủ đáng tin cậy và duy trì kết nối đó. Dịch vụ VPN sẽ tự động khởi động lại kết nối giữa các bản cập nhật ứng dụng, bất kể kết nối là qua Wi-Fi hay di động. Và nếu thiết bị khởi động lại, khung sẽ khởi động lại kết nối VPN.

Kết nối với dịch vụ VPN được minh bạch với người dùng. Đối với thiết bị do công ty sở hữu, người dùng không cần phải xác nhận hộp thoại đồng ý cho VPN ở chế độ luôn bật. Chế độ cài đặt mạng VPN của người dùng cho phép bật kết nối luôn bật theo cách thủ công.

Nếu DISALLOW_CONFIG_VPNtrue, người dùng sẽ không định cấu hình được VPN. Bật DISALLOW_DEBUGGING_FEATURES để hạn chế người dùng ghi đè VPN luôn bật bằng lệnh gỡ lỗi adb. Để ngăn người dùng gỡ cài đặt VPN, hãy gọi DevicePolicyManager.setUninstallBlocked.

Thiết lập dịch vụ VPN

Tổ chức sử dụng giải pháp dành cho doanh nghiệp của bạn cho Android sẽ thiết lập VPN.

  1. Cài đặt một ứng dụng VPN triển khai VpnService. Bạn có thể tìm thấy các dịch vụ VPN đang hoạt động bằng cách sử dụng bộ lọc ý định khớp với hành động VpnService.SERVICE_INTERFACE.
  2. Khai báo một VpnService trong tệp kê khai của ứng dụng được bảo vệ bằng quyền BIND_VPN_SERVICE.
  3. Hãy định cấu hình VpnService để hệ thống khởi động nó. Tránh đặt ứng dụng VPN để tự khởi động bằng cách theo dõi quá trình khởi động hệ thống và kiểm soát vòng đời của chính ứng dụng đó.
  4. Đặt cấu hình được quản lý cho ứng dụng VPN (xem ví dụ bên dưới).

Bật kết nối VPN luôn bật

DPC có thể định cấu hình kết nối VPN luôn bật thông qua một ứng dụng cụ thể bằng cách gọi DevicePolicyManager.setAlwaysOnVpnPackage().

Kết nối này được tự động cấp và sẽ duy trì sau khi khởi động lại. Nếu lockdownEnabled sai, lưu lượng truy cập mạng có thể không được bảo mật kể từ thời điểm điện thoại khởi động lại và VPN kết nối. Điều này sẽ hữu ích nếu bạn không muốn dừng kết nối mạng bất cứ khi nào VPN không hoạt động hoặc nếu VPN không cần thiết.

Xác minh kết nối VPN luôn bật

DPC có thể đọc tên gói quản lý kết nối VPN luôn bật cho người dùng hiện tại bằng DevicePolicyManager.getAlwaysOnVpnPackage().

Nếu không có gói nào như vậy hoặc VPN được tạo trong ứng dụng Cài đặt của hệ thống, thì null sẽ được trả về.

Ví dụ

Trong ứng dụng TestDPC, AlwaysOnVpnFragment.java sẽ dùng các API này để bật chế độ cài đặt cho kết nối VPN luôn bật.

Trong ví dụ sau đây:

  • Các cấu hình được quản lý của dịch vụ VPN do DevicePolicyManager đặt bằng cách sử dụng phương thức setApplicationRestrictions().
  • Các cấu hình được quản lý sử dụng các cặp khoá-giá trị tuỳ ý và ứng dụng ví dụ này dùng các cấu hình này ở nơi khác để định cấu hình chế độ cài đặt mạng của VPN (xem phần Kiểm tra cấu hình được quản lý).
  • Ví dụ này sẽ thêm trình cài đặt gói Android vào danh sách từ chối để không cập nhật các gói hệ thống qua VPN. Tất cả lưu lượng truy cập mạng của người dùng trong hồ sơ công việc hoặc thiết bị đều đi qua ứng dụng VPN này, ngoại trừ trình cài đặt gói; các bản cập nhật của ứng dụng này sử dụng Internet mở.
  • Sau đó, DevicePolicyManager sẽ bật kết nối VPN luôn bật cho gói VPN bằng cách sử dụng setAlwaysOnVpnPackage() và bật chế độ khoá.

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(...);
}

Thiết lập một mã mạng không dây duy nhất giữa các khu vực

Khi chạy ở chế độ chủ sở hữu thiết bị hoặc chế độ chủ sở hữu hồ sơ, trình kiểm soát chính sách thiết bị (DPC) có thể liên kết nhiều chứng chỉ của tổ chức phát hành chứng chỉ (CA) với một cấu hình mạng không dây. Với cấu hình này, thiết bị có thể kết nối với các điểm truy cập không dây có cùng tên mạng hoặc có cùng giá trị nhận dạng bộ dịch vụ (SSID), nhưng được định cấu hình bằng các chứng chỉ CA khác. Điều này sẽ hữu ích nếu mạng không dây của tổ chức của bạn ở trên nhiều khu vực địa lý và mỗi khu vực yêu cầu một tổ chức phát hành chứng chỉ khác nhau. Ví dụ: chữ ký pháp lý có thể cần phải có một cơ quan quản lý tại địa phương cần có CA theo khu vực.

Lưu ý: Android đã hỗ trợ setCaCertificate kể từ API 18 (Jelly Bean). Tuy nhiên, quản trị viên CNTT phải cung cấp mạng riêng với từng CA để đảm bảo các thiết bị có quy trình xác thực liền mạch tại mỗi điểm truy cập, bất kể khu vực.

Chỉ định chứng chỉ CA để xác định máy chủ

Để chỉ định danh sách chứng chỉ X.509 giúp nhận dạng máy chủ sử dụng cùng SSID, hãy đưa tất cả các CA có liên quan vào cấu hình không dây bằng WifiEnterpriseConfig.setCaCertificates().

Chứng chỉ của máy chủ là hợp lệ nếu CA của máy chủ khớp với một trong các chứng chỉ đã cho. Tên mặc định được tự động gán cho các chứng chỉ và sử dụng trong cấu hình. WifiManager cài đặt chứng chỉ và tự động lưu cấu hình khi mạng được bật, đồng thời xoá chứng chỉ khi cấu hình bị xoá.

Để lấy tất cả các chứng chỉ CA liên kết với cấu hình không dây, hãy sử dụng WifiEnterpriseConfig.getCaCertificates() để trả về danh sách đối tượng X509Certificate.

Thêm một cấu hình không dây bằng cách sử dụng nhiều chứng chỉ CA

  1. Xác minh danh tính của máy chủ:
    1. Tải chứng chỉ CA X.509.
    2. Tải khoá riêng tư và chứng chỉ của ứng dụng. Xem phần Bảo mật bằng HTTPS và SSL để biết ví dụ về cách đọc tệp chứng chỉ.
  2. Tạo WifiConfiguration mới rồi đặt SSID và chế độ quản lý khoá.
  3. Thiết lập thực thể WifiEnterpriseConfig trên WifiConfiguration này.
    1. Xác định máy chủ bằng danh sách đối tượng X509Certificate bằng setCaCertificates().
    2. Đặt thông tin đăng nhập, danh tính và mật khẩu của ứng dụng.
    3. Đặt phương thức Giao thức xác thực mở rộng (EAP) và Giai đoạn 2 làm một phần để thiết lập kết nối.
  4. Thêm mạng bằng WifiManager.
  5. Bật mạng. WifiManager sẽ tự động lưu cấu hình trong quá trình thiết lập.

Ví dụ sau gắn các bước với nhau:

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);
}

Chỉ định một trình quay số riêng cho hồ sơ công việc

Bạn có thể đưa một ứng dụng trình quay số riêng vào danh sách cho phép để sử dụng trong hồ sơ công việc. Đây có thể là chính trình quay số hoặc một ứng dụng Voice over IP (VoIP) triển khai API ConnectionService cho phần phụ trợ gọi. Điều này mang đến trải nghiệm quay số giao diện người dùng của hệ thống tích hợp tương tự cho các ứng dụng VoIP trong hồ sơ công việc, biến trình quay số công việc trở thành tính năng cốt lõi một cách hiệu quả. Cuộc gọi đến tài khoản gọi điện cho công việc sẽ được phân biệt với cuộc gọi đến với tài khoản gọi cá nhân.

Người dùng có thể chọn thực hiện và nhận cuộc gọi từ trình quay số công việc trong danh sách cho phép trên tài khoản điện thoại. Tất cả các cuộc gọi được thực hiện từ trình quay số đó hoặc cuộc gọi đến tài khoản điện thoại công việc đều được ghi lại trong nhà cung cấp CallLog của hồ sơ công việc. Trình quay số công việc duy trì nhật ký cuộc gọi chỉ dành cho công việc và chỉ có quyền truy cập vào danh bạ công việc. Các cuộc gọi có công tắc mạch đến được trình quay số chính xử lý và được lưu trữ trong nhật ký cuộc gọi cá nhân. Nếu hồ sơ công việc bị xoá, nhật ký cuộc gọi liên kết với hồ sơ công việc đó cũng sẽ bị xoá, cũng như mọi dữ liệu hồ sơ công việc.

Ứng dụng bên thứ ba phải triển khai ConnectionService

Các ứng dụng VoIP bên thứ ba cần thực hiện cuộc gọi điện thoại và được tích hợp những cuộc gọi đó vào ứng dụng điện thoại tích hợp sẵn có thể triển khai API ConnectionService. Đây là yêu cầu bắt buộc đối với mọi dịch vụ VoIP dùng để gọi công việc. Những ứng dụng này được hưởng lợi khi có các lệnh gọi được xử lý như lệnh gọi di động truyền thống, chẳng hạn như chúng sẽ xuất hiện trong trình quay số hệ thống tích hợp sẵn và nhật ký cuộc gọi. Nếu ứng dụng triển khai ConnectionService được cài đặt trong hồ sơ công việc, thì chỉ trình quay số cũng được cài đặt trong hồ sơ công việc đó mới có thể truy cập vào ứng dụng đó.

Sau khi triển khai ConnectionService, nhà phát triển cần thêm đối tượng này vào tệp kê khai của ứng dụng và đăng ký PhoneAccount bằng TelecomManager. Tài khoản điện thoại đại diện cho một phương thức riêng để thực hiện hoặc nhận cuộc gọi điện thoại, đồng thời có thể có nhiều PhoneAccounts cho mỗi ConnectionService. Sau khi đăng ký tài khoản điện thoại, người dùng có thể bật tài khoản đó thông qua chế độ cài đặt trình quay số.

Thông báo và tích hợp giao diện người dùng hệ thống

Giao diện người dùng hệ thống cung cấp cho người dùng trải nghiệm gọi điện nhất quán và tích hợp cho các ứng dụng bên thứ ba sử dụng API ConnectionService làm phần phụ trợ để thực hiện cuộc gọi. Nếu bạn dùng ứng dụng trong hồ sơ công việc, biểu tượng cặp tài liệu sẽ xuất hiện khi có cuộc gọi đến và trên thanh trạng thái. Ứng dụng triển khai ConnectionService được cài đặt trong hồ sơ công việc có thể sử dụng trình quay số hệ thống hoặc tạo một trình quay số công việc riêng biệt. Đây có thể là một ứng dụng đơn lẻ hoặc các ứng dụng riêng biệt.

Ứng dụng quay số sẽ xác định xem có đang thực hiện hoặc nhận cuộc gọi công việc hay không bằng cách kiểm tra cờ android.telecom.Call.Details.PROPERTY_ENTERPRISE_CALL. Nếu cuộc gọi là cuộc gọi công việc, thì trình quay số sẽ cho người dùng biết điều này bằng cách thêm huy hiệu công việc (biểu tượng cặp tài liệu):

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
}