เครือข่ายและโทรศัพท์

ฟีเจอร์ต่างๆ ในคู่มือนี้จะอธิบายการจัดการเครือข่ายและโทรศัพท์ ความสามารถที่คุณสามารถนำไปใช้ในนโยบายด้านอุปกรณ์ Controller (DPC) เอกสารนี้มีโค้ด และคุณยังสามารถใช้การทดสอบ แอป DPC ในฐานะ แหล่งที่มาของโค้ดตัวอย่างสำหรับฟีเจอร์ระดับองค์กรของ Android

แอป DPC สามารถทำงานในโหมดเจ้าของโปรไฟล์ในอุปกรณ์ส่วนตัวหรือในอุปกรณ์เจ้าของ ในอุปกรณ์ที่มีการจัดการครบวงจร ตารางนี้ระบุว่าฟีเจอร์ใด พร้อมใช้งานเมื่อ DPC ทำงานในโหมดเจ้าของโปรไฟล์หรือเจ้าของอุปกรณ์ โหมดต่อไปนี้

ฟีเจอร์ เจ้าของโปรไฟล์ เจ้าของอุปกรณ์
เข้าถึงรายชื่อติดต่อของที่ทำงาน ในโปรไฟล์ต่างๆ
ตรวจสอบให้แน่ใจว่า การเชื่อมต่อเครือข่ายที่ปลอดภัยสำหรับการจราจรของข้อมูล
ตั้งค่า รหัสเครือข่ายไร้สายเดียวในภูมิภาคต่างๆ
ระบุ แป้นโทรศัพท์แยกต่างหากสำหรับโปรไฟล์งาน

เข้าถึงรายชื่อติดต่อที่ทำงานในโปรไฟล์ต่างๆ

EMM สามารถอนุญาตให้โปรไฟล์ส่วนตัวของผู้ใช้เข้าถึงรายชื่อติดต่อสำหรับงานเพื่อให้ เข้าถึงรายชื่อติดต่อส่วนตัวและที่ทํางานของผู้ใช้ได้ผ่านการค้นหาในพื้นที่และ การค้นหาไดเรกทอรีระยะไกล ในอุปกรณ์ส่วนตัว แป้นโทรศัพท์เดียวในอุปกรณ์ส่วนตัว สามารถโทรออกและรับสายส่วนตัว รวมถึงโทรศัพท์สำหรับงานได้ นอกจากนี้ ข้อมูลติดต่อที่ทำงานจะผสานรวมอยู่ใน UI ของระบบ หากโปรไฟล์งานคือ มีการเข้ารหัส โปรไฟล์ส่วนตัวจะไม่สามารถเข้าถึงข้อมูลได้

ผสานรวมกับ UI ของระบบ

UI ของระบบจะระบุว่ามีสายเรียกเข้างานโดยใช้ไอคอนกระเป๋าเอกสาร callLog ยังแสดง เพื่อกำหนดสายเรียกเข้าและสายโทรออกงาน แป้นโทรศัพท์ส่วนบุคคลและ แอปรายชื่อติดต่อสามารถแสดงข้อมูลหมายเลขผู้โทรของผู้ติดต่อที่ทำงานโดยใช้รีโมต ค้นหาไดเรกทอรี จึงไม่จำเป็นต้องซิงค์รายชื่อติดต่ออยู่แล้วกับ อุปกรณ์ในเครือข่ายเดียวกัน แอปรับส่งข้อความสามารถใช้หมายเลขผู้โทรในอุปกรณ์และค้นหาได้

คำจำกัดความความเข้ากันได้กับ Android เอกสาร (CDD) มีข้อกำหนด เพื่อให้รายชื่อติดต่อของที่ทำงานแสดงในแป้นโทรศัพท์เริ่มต้น และข้อกำหนดที่ รายชื่อติดต่อและแอปรับส่งข้อความจะมีป้ายระบุว่ามาจากที่ทำงาน โปรไฟล์

รายชื่อติดต่อของที่ทำงานเข้าถึงและค้นหาได้

ผู้ใช้สามารถเข้าถึงและโทรหาผู้ติดต่อสำหรับงานได้จากโปรไฟล์ส่วนตัว แสดงในหน้าจอค้นหาของแอปโทรศัพท์ ผู้ใช้ค้นหางานได้ รายชื่อติดต่อโดยใช้การเติมข้อความอัตโนมัติ ซึ่งซิงค์กับอุปกรณ์และแสดงอยู่ในรายการ ผ่านการค้นหาไดเรกทอรีระยะไกล

ควบคุมรายชื่อติดต่อสำหรับงานในโปรไฟล์หลัก

DPC จะควบคุมสิทธิ์ในการค้นหารายชื่อติดต่อสำหรับงาน กำลังทำงานในเจ้าของโปรไฟล์ DPC จะจัดการการแสดงรายชื่อติดต่อสำหรับงานในโปรไฟล์ส่วนตัว สำหรับข้อมูลเพิ่มเติม โปรดดู สร้างนโยบายด้านอุปกรณ์

ระบบจะเปิดใช้การค้นหารายชื่อติดต่อสำหรับงานด้วยโปรไฟล์ส่วนตัวโดยค่าเริ่มต้น

ตรวจสอบการเชื่อมต่อเครือข่ายที่ปลอดภัยสำหรับการจราจรของข้อมูล

การทำงานในโหมดเจ้าของอุปกรณ์หรือโหมดเจ้าของโปรไฟล์ นโยบายด้านอุปกรณ์ ตัวควบคุมสามารถใช้การเชื่อมต่อ Virtual Private Network (VPN) แบบเปิดตลอดเวลาเพื่อ บังคับให้แอปพลิเคชันส่งผ่านการจราจรของข้อมูลผ่านแอป VPN ที่ระบุซึ่งไม่สามารถ ข้าม การใช้การเชื่อมต่อ VPN แบบเปิดตลอดเวลาทำให้ DPC สามารถดูแลให้เครือข่าย การเข้าชมจากโปรไฟล์งานหรืออุปกรณ์ที่มีการจัดการจะส่งผ่านบริการ VPN และ โดยไม่ต้องให้ผู้ใช้จัดการ ขั้นตอนนี้จะสร้างการเชื่อมต่อเครือข่ายที่ปลอดภัยสำหรับ การเข้าชมอย่างต่อเนื่องภายในโปรไฟล์งาน

เกี่ยวกับการเชื่อมต่อ VPN แบบเปิดตลอดเวลา

ในกรอบการทำงานของระบบ การกำหนดเส้นทาง VPN จะได้รับการจัดการโดยอัตโนมัติเพื่อให้ ผู้ใช้ไม่สามารถข้ามบริการ VPN ได้ หากยกเลิกการเชื่อมต่อบริการ VPN ขณะอยู่ใน ทำให้การเข้าชมรั่วไหลไปยังอินเทอร์เน็ตสาธารณะไม่ได้ สำหรับแอปพลิเคชัน การใช้ VpnService, การเชื่อมต่อ VPN ตลอดเวลาเป็นเฟรมเวิร์กสำหรับการจัดการการเชื่อมต่อ VPN ที่ปลอดภัยผ่าน เซิร์ฟเวอร์ที่ไว้วางใจได้และให้บริการต่อไป บริการ VPN จะรีสตาร์ทโดยอัตโนมัติ โดยไม่คำนึงว่าจะเชื่อมต่อผ่าน Wi-Fi หรือ เครือข่ายมือถือ และหากรีบูตอุปกรณ์ เฟรมเวิร์กจะรีสตาร์ทการเชื่อมต่อ VPN

การเชื่อมต่อกับบริการ VPN มีความโปร่งใสต่อผู้ใช้ สำหรับ อุปกรณ์ของบริษัท ผู้ใช้ไม่จำเป็นต้องยืนยันกล่องโต้ตอบความยินยอมสำหรับ VPN ในโหมดเปิดตลอดเวลา การตั้งค่าเครือข่าย VPN ของผู้ใช้ ช่วยในการเปิดใช้ การเชื่อมต่อแบบเปิดตลอดเวลาด้วยตนเอง

หาก DISALLOW_CONFIG_VPN true ป้องกันไม่ให้ผู้ใช้กำหนดค่า VPN เปิดใช้ DISALLOW_DEBUGGING_FEATURES เพื่อจำกัดผู้ใช้ไม่ให้ลบล้าง VPN แบบเปิดตลอดเวลาโดยใช้คำสั่งการแก้ไขข้อบกพร่อง adb หากไม่ต้องการให้ผู้ใช้ถอนการติดตั้ง VPN โปรดโทร DevicePolicyManager.setUninstallBlocked

ตั้งค่าบริการ VPN

องค์กรที่ใช้โซลูชันสำหรับองค์กรสำหรับ Android ของคุณเป็นผู้ตั้งค่า VPN

  1. ติดตั้งแอป VPN ที่ใช้งาน VpnService คุณสามารถค้นหาบริการ VPN ที่ใช้งานอยู่ได้โดยใช้ตัวกรอง Intent ที่ตรงกับ การกระทำ VpnService.SERVICE_INTERFACE
  2. ประกาศ VpnService ในไฟล์ Manifest ของแอปที่ปกป้องโดยสิทธิ์ BIND_VPN_SERVICE
  3. กําหนดค่า VpnService ดังนั้นระบบจึงเริ่มต้น หลีกเลี่ยงการตั้งค่าแอป VPN ให้เริ่มทำงานเองโดย คอยฟังการเปิดเครื่องและควบคุมวงจรชีวิตของตัวเอง
  4. ตั้งค่าช่องที่มีการจัดการ การกำหนดค่าสำหรับ แอป VPN (ดูตัวอย่างด้านล่าง)

เปิดใช้การเชื่อมต่อ VPN ตลอดเวลา

DPC สามารถกำหนดค่าการเชื่อมต่อ VPN แบบเปิดตลอดเวลาผ่านทางแอปเฉพาะได้โดย การโทร DevicePolicyManager.setAlwaysOnVpnPackage()

ระบบจะให้สิทธิ์การเชื่อมต่อนี้โดยอัตโนมัติและจะยังคงอยู่หลังจากการรีบูต ถ้า lockdownEnabled เป็นเท็จ การจราจรของข้อมูลในเครือข่ายอาจไม่ปลอดภัยตั้งแต่เวลาที่ โทรศัพท์จะรีบูตและ VPN จะเชื่อมต่อ ซึ่งจะเป็นประโยชน์ในกรณีที่คุณไม่อยากหยุด การเชื่อมต่อเครือข่ายเมื่อใดก็ตามที่ VPN ล้มเหลว หรือหาก VPN ไม่จำเป็น

ยืนยันการเชื่อมต่อ VPN แบบเปิดตลอดเวลา

DPC สามารถอ่านชื่อแพ็กเกจที่ใช้ VPN แบบเปิดตลอดเวลา การเชื่อมต่อสำหรับผู้ใช้ปัจจุบันกับ DevicePolicyManager.getAlwaysOnVpnPackage().

หากไม่มีแพ็กเกจดังกล่าว หรือมีการสร้าง VPN ภายในการตั้งค่าระบบ แอป null ส่งคืนแล้ว

ตัวอย่าง

โดย AlwaysOnVpnFragment.java จะใช้ API เหล่านี้เพื่อเปิดใช้การตั้งค่าสำหรับการเชื่อมต่อ VPN แบบเปิดตลอดเวลาในแอป TestDPC

ในตัวอย่างต่อไปนี้:

  • บัญชีที่มีการจัดการ ของการตั้งค่า บริการ VPN ได้รับการตั้งค่าโดย DevicePolicyManager โดยใช้ setApplicationRestrictions()
  • การกำหนดค่าที่มีการจัดการใช้คู่คีย์-ค่าที่กำหนดเองและแอปตัวอย่างนี้ ใช้ VPN ในที่อื่นๆ เพื่อกำหนดการตั้งค่าเครือข่ายของ 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(...);
}

ตั้งค่ารหัสเครือข่ายไร้สายรหัสเดียวในภูมิภาคต่างๆ

การทำงานในโหมดเจ้าของอุปกรณ์หรือโหมดเจ้าของโปรไฟล์ นโยบายด้านอุปกรณ์ ผู้ควบคุมข้อมูล (DPC) สามารถเชื่อมโยงใบรับรองของผู้ออกใบรับรอง (CA) หลายรายการ ด้วยการกำหนดค่าเครือข่ายไร้สายรายการเดียว ในการกำหนดค่าแบบนี้ อุปกรณ์ สามารถเชื่อมต่อกับจุดเข้าใช้งานแบบไร้สายที่มีชื่อเครือข่ายเหมือนกัน หรือ Service Set Identifier (SSID) แต่กําหนดค่าด้วย CA อื่น ใบรับรอง วิธีนี้มีประโยชน์หากเครือข่ายไร้สายขององค์กรมีลักษณะดังนี้ ในหลายพื้นที่ โดยแต่ละภูมิภาคจำเป็นต้องใช้ ผู้ออกใบรับรอง ตัวอย่างเช่น ลายเซ็นทางกฎหมายอาจต้องมี ที่จำเป็นต้องใช้ CA ระดับภูมิภาค

หมายเหตุ: Android มีการสนับสนุน setCaCertificate ตั้งแต่ API 18 (Jelly Bean) แต่ผู้ดูแลระบบไอทีต้องจัดสรรเครือข่าย แยกต่างหากในแต่ละ CA เพื่อให้แน่ใจว่าอุปกรณ์มีการตรวจสอบสิทธิ์ที่ราบรื่นในแต่ละ CA โดยไม่พิจารณาภูมิภาค

ระบุใบรับรอง CA เพื่อระบุเซิร์ฟเวอร์

เพื่อระบุรายการใบรับรอง X.509 ที่ระบุเซิร์ฟเวอร์ที่ใช้ SSID ให้รวม CA ที่เกี่ยวข้องทั้งหมดในการกำหนดค่าแบบไร้สายโดยใช้ WifiEnterpriseConfig.setCaCertificates()

ใบรับรองของเซิร์ฟเวอร์จะถูกต้องหาก CA ของเซิร์ฟเวอร์ตรงกับใบรับรองที่ระบุ ระบบจะกำหนดชื่อเริ่มต้นให้กับใบรับรองโดยอัตโนมัติและใช้ภายใน การกำหนดค่า WifiManager ติดตั้งใบรับรองและบันทึกการกำหนดค่าโดยอัตโนมัติเมื่อ เครือข่ายเปิดใช้อยู่ และนำใบรับรองออกเมื่อมีการกำหนดค่า ลบแล้ว

ในการรับใบรับรอง CA ทั้งหมดที่เชื่อมโยงกับการกำหนดค่าแบบไร้สาย ให้ใช้ WifiEnterpriseConfig.getCaCertificates() เพื่อแสดงรายการ X509Certificate ออบเจ็กต์

เพิ่มการกำหนดค่าแบบไร้สายโดยใช้ใบรับรอง CA หลายรายการ

  1. ยืนยันตัวตนของเซิร์ฟเวอร์โดยทำดังนี้
    1. โหลดใบรับรอง X.509 CA
    2. โหลดคีย์ส่วนตัวและใบรับรองของไคลเอ็นต์ โปรดดูตัวอย่างวิธีการอ่านไฟล์ใบรับรองในการรักษาความปลอดภัยด้วย HTTPS และ SSL
  2. สร้างใหม่ WifiConfiguration แล้วตั้งค่า SSID และการจัดการคีย์
  3. ตั้งค่า WifiEnterpriseConfig อินสแตนซ์ใน WifiConfiguration นี้
    1. ระบุเซิร์ฟเวอร์ด้วยลิสต์ X509Certificate ออบเจ็กต์ที่ใช้ setCaCertificates()
    2. ตั้งค่าข้อมูลเข้าสู่ระบบไคลเอ็นต์ ข้อมูลระบุตัวตน และรหัสผ่าน
    3. ตั้งค่า Extensible Authentication Protocol (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);
}

ระบุแป้นโทรศัพท์แยกต่างหากสำหรับโปรไฟล์งาน

คุณสามารถอนุญาตแอปพลิเคชันแป้นโทรศัพท์แยกต่างหากเพื่อใช้ในโปรไฟล์งาน ซึ่งอาจเป็นตัวโทรศัพท์ หรือแอป Voice over IP (VoIP) ที่ใช้ ConnectionService API สำหรับแบ็กเอนด์การเรียกใช้ ซึ่งจะมีแป้นหมายเลข UI ของระบบที่ผสานรวมให้เหมือนกัน ในการใช้งานแอปพลิเคชัน VoIP ในโปรไฟล์งานได้อย่างมีประสิทธิภาพ แป้นโทรศัพท์ ฟีเจอร์หลัก สายเรียกเข้าในบัญชีงาน ที่ต่างจากสายเรียกเข้าไปยังบัญชีการโทรส่วนตัว

ผู้ใช้เลือกที่จะโทรออกและรับสายจากแป้นโทรศัพท์สำหรับงานในรายการที่อนุญาตได้ บัญชีโทรศัพท์ การโทรทั้งหมดจากแป้นโทรศัพท์หรือสายเรียกเข้าไปที่ที่ทำงาน และบันทึกไว้ในโปรไฟล์งาน CallLog แป้นโทรศัพท์งานจะเก็บบันทึกการโทรเฉพาะงานไว้ โดยมีสิทธิ์เข้าถึง ข้อมูลติดต่อที่ทำงาน การโทรแบบเปลี่ยนวงจรขาเข้าจะจัดการโดยแป้นโทรศัพท์หลัก และเก็บไว้ในบันทึกการโทรส่วนตัว หากลบโปรไฟล์งาน ประวัติการโทร ที่เชื่อมโยงกับโปรไฟล์งานนั้น ระบบจะลบด้วย รวมถึงโปรไฟล์งานทั้งหมด

แอปของบุคคลที่สามต้องใช้ ConnectionService

แอป VoIP ของบุคคลที่สามที่ต้องโทรออกและต้องรับสายเหล่านั้น ที่ผสานรวมไว้ในแอปโทรศัพท์ในตัวสามารถใช้ ConnectionService API ซึ่งจำเป็นสำหรับบริการ VoIP ที่ใช้โทรในที่ทำงาน แอปเหล่านี้ จะได้ประโยชน์จากการโทรเหล่านี้เหมือนใช้ การโทรผ่านเครือข่ายมือถือแบบดั้งเดิม ตัวอย่างเช่น ข้อความจะปรากฏในแป้นโทรศัพท์ในตัวและบันทึกการโทร หาก การใช้งานแอป ConnectionService ในโปรไฟล์งาน จะเข้าถึงได้โดยแป้นโทรศัพท์เท่านั้น ติดตั้งในโปรไฟล์งานนั้น

เมื่อนักพัฒนาแอปนำไปใช้ ConnectionService, ควรเพิ่มไฟล์ดังกล่าวลงในไฟล์ Manifest ของแอปและลงทะเบียน วันที่ 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
}