รายชื่อติดต่อในโปรไฟล์งาน

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

ภาพรวม

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

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

ประสบการณ์ของผู้ใช้

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

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

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

วันที่ ภาพหน้าจอแสดงผลการค้นหาในรายการ
รูปที่ 1 วิธีที่แอป Google Contacts แยกโปรไฟล์งาน รายชื่อติดต่อ

ในตัวอย่างนี้ แอป Google Contacts (แสดงในรูปที่ 1) ทำสิ่งต่อไปนี้เพื่อ แสดงรายชื่อติดต่อในโปรไฟล์ที่ทำงานและโปรไฟล์ส่วนตัวผสมกัน

  1. แทรกส่วนหัวย่อยเพื่อแยกส่วนงานและส่วนส่วนตัวของรายการ
  2. ป้ายแสดงข้อมูลติดต่อที่ทำงานด้วยไอคอนกระเป๋าเอกสาร
  3. เปิดรายชื่อติดต่อที่ทำงานในโปรไฟล์งานเมื่อแตะ

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

สิทธิ์

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

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

การค้นหารายชื่อติดต่อ

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

  1. ตั้งค่า URI ผู้ให้บริการเนื้อหาเป็น Contacts.ENTERPRISE_CONTENT_FILTER_URI และระบุชื่อผู้ติดต่อเป็นสตริงการค้นหา
  2. ตั้งค่าไดเรกทอรีรายชื่อติดต่อเพื่อค้นหา ตัวอย่างเช่น ENTERPRISE_DEFAULT ค้นหารายชื่อติดต่อในการทำงาน ร้านค้าในพื้นที่ของโปรไฟล์

การเปลี่ยน URI จะทำงานกับกลไกของผู้ให้บริการเนื้อหาใดก็ได้ เช่น CursorLoader - เหมาะสำหรับการโหลดข้อมูลรายชื่อติดต่อลงในอินเทอร์เฟซผู้ใช้เนื่องจาก การเข้าถึงข้อมูลจะเกิดขึ้นในชุดข้อความของผู้ปฏิบัติงาน เพื่อให้เข้าใจง่าย ตัวอย่างใน เป็นไกด์ที่โทร ContentResolver.query() ต่อไปนี้คือวิธีค้นหา รายชื่อติดต่อในไดเรกทอรีรายชื่อติดต่อในเครื่องของโปรไฟล์งาน

Kotlin

// First confirm the device user has given permission for the personal profile.
// There isn't a separate work permission, but an IT admin can block access.
val readContactsPermission =
  ContextCompat.checkSelfPermission(getBaseContext(), Manifest.permission.READ_CONTACTS)
if (readContactsPermission != PackageManager.PERMISSION_GRANTED) {
  return
}

// Fetch Jackie, James, & Jason (and anyone else whose names begin with "ja").
val nameQuery = Uri.encode("ja")

// Build the URI to look up work profile contacts whose name matches. Query
// the default work profile directory which is the locally-stored contacts.
val contentFilterUri =
  ContactsContract.Contacts.ENTERPRISE_CONTENT_FILTER_URI
    .buildUpon()
    .appendPath(nameQuery)
    .appendQueryParameter(
      ContactsContract.DIRECTORY_PARAM_KEY,
      ContactsContract.Directory.ENTERPRISE_DEFAULT.toString()
    )
    .build()

// Query the content provider using the generated URI.
var cursor =
  getContentResolver()
    .query(
      contentFilterUri,
      arrayOf(
        ContactsContract.Contacts._ID,
        ContactsContract.Contacts.LOOKUP_KEY,
        ContactsContract.Contacts.DISPLAY_NAME_PRIMARY
      ),
      null,
      null,
      null
    )

// Print any results found using the work profile contacts' display name.
cursor?.use {
  while (it.moveToNext()) {
    Log.i(TAG, "Work profile contact: ${it.getString(2)}")
  }
}

Java

// First confirm the device user has given permission for the personal profile.
// There isn't a separate work permission, but an IT admin can block access.
int readContactsPermission = ContextCompat.checkSelfPermission(
    getBaseContext(), Manifest.permission.READ_CONTACTS);
if (readContactsPermission != PackageManager.PERMISSION_GRANTED) {
  return;
}

// Fetch Jackie, James, & Jason (and anyone else whose names begin with "ja").
String nameQuery = Uri.encode("ja");

// Build the URI to look up work profile contacts whose name matches. Query
// the default work profile directory which is the locally stored contacts.
Uri contentFilterUri = ContactsContract.Contacts.ENTERPRISE_CONTENT_FILTER_URI
    .buildUpon()
    .appendPath(nameQuery)
    .appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY,
        String.valueOf(ContactsContract.Directory.ENTERPRISE_DEFAULT))
    .build();

// Query the content provider using the generated URI.
Cursor cursor = getContentResolver().query(
    contentFilterUri,
    new String[] {
        ContactsContract.Contacts._ID,
        ContactsContract.Contacts.LOOKUP_KEY,
        ContactsContract.Contacts.DISPLAY_NAME_PRIMARY
    },
    null,
    null,
    null);
if (cursor == null) {
  return;
}

// Print any results found using the work profile contacts' display name.
try {
  while (cursor.moveToNext()) {
    Log.i(TAG, "Work profile contact: " + cursor.getString(2));
  }
} finally {
  cursor.close();
}

ไดเรกทอรี

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

ค้นหา Directory.ENTERPRISE_CONTENT_URI ให้ดึงไดเรกทอรีจากโปรไฟล์ส่วนตัวและงาน แสดงผลพร้อมกัน ระบบรองรับการค้นหาไดเรกทอรีโปรไฟล์งานใน Android 7.0 (API ระดับ 24) ขึ้นไป แอปของคุณยังต้องให้ผู้ใช้ให้สิทธิ์ สิทธิ์ READ_CONTACTS ในการทำงานร่วมกับรายชื่อติดต่อ ไดเรกทอรี

เนื่องจาก Android จัดเก็บข้อมูลรายชื่อติดต่อเป็นข้อมูลธุรกิจในพื้นที่ประเภทต่างๆ ไดเรกทอรีระยะไกล คลาส Directory มีเมธอดที่คุณสามารถเรียกใช้เพื่อค้นหาเพิ่มเติม เกี่ยวกับไดเรกทอรี:

isEnterpriseDirectoryId()
เรียกใช้วิธีการนี้เพื่อดูว่าไดเรกทอรีมาจากบัญชีโปรไฟล์งานหรือไม่ โปรดทราบว่าผู้ให้บริการเนื้อหา ENTERPRISE_CONTENT_URI ส่งคืนรายชื่อติดต่อ ไดเรกทอรีสำหรับโปรไฟล์ส่วนตัวและโปรไฟล์งานไว้ด้วยกัน
isRemoteDirectoryId()
เรียกใช้เมธอดนี้เพื่อดูว่าไดเรกทอรีเป็นแบบระยะไกลหรือไม่ ไดเรกทอรีระยะไกล อาจเป็นร้านค้าติดต่อขององค์กรหรือเครือข่ายสังคมของผู้ใช้

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

Kotlin

// First, confirm the device user has given READ_CONTACTS permission.
// This permission is still needed for directory listings ...

// Query the content provider to get directories for BOTH the personal and
// work profiles.
val cursor =
  getContentResolver()
    .query(
      ContactsContract.Directory.ENTERPRISE_CONTENT_URI,
      arrayOf(ContactsContract.Directory._ID, ContactsContract.Directory.PACKAGE_NAME),
      null,
      null,
      null
    )

// Print the package name of the work profile's local or remote contact directories.
cursor?.use {
  while (it.moveToNext()) {
    val directoryId = it.getLong(0)
    if (ContactsContract.Directory.isEnterpriseDirectoryId(directoryId)) {
      Log.i(TAG, "Directory: ${it.getString(1)}")
    }
  }
}

Java

// First, confirm the device user has given READ_CONTACTS permission.
// This permission is still needed for directory listings ...

// Query the content provider to get directories for BOTH the personal and
// work profiles.
Cursor cursor = getContentResolver().query(
    ContactsContract.Directory.ENTERPRISE_CONTENT_URI,
    new String[]{
        ContactsContract.Directory._ID,
        ContactsContract.Directory.PACKAGE_NAME
    },
    null,
    null,
    null);
if (cursor == null) {
  return;
}

// Print the package name of the work profile's local or remote contact directories.
try {
  while (cursor.moveToNext()) {
    long directoryId = cursor.getLong(0);

    if (ContactsContract.Directory.isEnterpriseDirectoryId(directoryId)) {
      Log.i(TAG, "Directory: " + cursor.getString(1));
    }
  }
} finally {
  cursor.close();
}

ตัวอย่างนี้จะดึงข้อมูลรหัสและชื่อแพ็กเกจสำหรับไดเรกทอรี วิธีแสดงผู้ใช้ ที่ช่วยให้ผู้ใช้เลือกแหล่งที่มาของไดเรกทอรีรายชื่อติดต่อ คุณอาจต้อง ดึงข้อมูลเพิ่มเติมเกี่ยวกับไดเรกทอรี หากต้องการดูช่องข้อมูลเมตาอื่นๆ ที่ อาจมีให้อ่านข้อมูลอ้างอิงของชั้นเรียน Directory

การค้นหาในโทรศัพท์

แอปค้นหาได้ PhoneLookup.CONTENT_FILTER_URI เพื่อให้มีประสิทธิภาพ ให้ค้นหาข้อมูลรายชื่อติดต่อสำหรับหมายเลขโทรศัพท์ คุณสามารถดูผลการค้นหาจาก ทั้งผู้ให้บริการติดต่อส่วนบุคคลและของโปรไฟล์งาน ถ้าคุณแทนที่ URI นี้ด้วย PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI URI เนื้อหาของโปรไฟล์งานนี้พร้อมใช้งานใน Android 5.0 (API ระดับ 21) หรือ สูงขึ้น

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

Kotlin

fun onCreateIncomingConnection(
  connectionManagerPhoneAccount: PhoneAccountHandle,
  request: ConnectionRequest
): Connection {
  var request = request
  // Get the telephone number from the incoming request URI.
  val phoneNumber = this.extractTelephoneNumber(request.address)

  var displayName = "Unknown caller"
  var isCallerInWorkProfile = false

  // Look up contact details for the caller in the personal and work profiles.
  val lookupUri =
    Uri.withAppendedPath(
      ContactsContract.PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI,
      Uri.encode(phoneNumber)
    )
  val cursor =
    getContentResolver()
      .query(
        lookupUri,
        arrayOf(
          ContactsContract.PhoneLookup._ID,
          ContactsContract.PhoneLookup.DISPLAY_NAME,
          ContactsContract.PhoneLookup.CUSTOM_RINGTONE
        ),
        null,
        null,
        null
      )

  // Use the first contact found and check if they're from the work profile.
  cursor?.use {
    if (it.moveToFirst() == true) {
      displayName = it.getString(1)
      isCallerInWorkProfile = ContactsContract.Contacts.isEnterpriseContactId(it.getLong(0))
    }
  }

  // Return a configured connection object for the incoming call.
  val connection = MyAudioConnection()
  connection.setCallerDisplayName(displayName, TelecomManager.PRESENTATION_ALLOWED)

  // Our app's activity uses this value to decide whether to show a work badge.
  connection.setIsCallerInWorkProfile(isCallerInWorkProfile)

  // Configure the connection further ...
  return connection
}

Java

public Connection onCreateIncomingConnection (
    PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request) {
  // Get the telephone number from the incoming request URI.
  String phoneNumber = this.extractTelephoneNumber(request.getAddress());

  String displayName = "Unknown caller";
  boolean isCallerInWorkProfile = false;

  // Look up contact details for the caller in the personal and work profiles.
  Uri lookupUri = Uri.withAppendedPath(
      ContactsContract.PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI,
      Uri.encode(phoneNumber));
  Cursor cursor = getContentResolver().query(
      lookupUri,
      new String[]{
          ContactsContract.PhoneLookup._ID,
          ContactsContract.PhoneLookup.DISPLAY_NAME,
          ContactsContract.PhoneLookup.CUSTOM_RINGTONE
      },
      null,
      null,
      null);

  // Use the first contact found and check if they're from the work profile.
  if (cursor != null) {
    try {
      if (cursor.moveToFirst() == true) {
        displayName = cursor.getString(1);
        isCallerInWorkProfile =
            ContactsContract.Contacts.isEnterpriseContactId(cursor.getLong(0));
      }
    } finally {
      cursor.close();
    }
  }

  // Return a configured connection object for the incoming call.
  MyConnection connection = new MyConnection();
  connection.setCallerDisplayName(displayName, TelecomManager.PRESENTATION_ALLOWED);

  // Our app's activity uses this value to decide whether to show a work badge.
  connection.setIsCallerInWorkProfile(isCallerInWorkProfile);

  // Configure the connection further ...
  return connection;
}

การค้นหาอีเมล

แอปของคุณสามารถรับข้อมูลติดต่อส่วนตัวหรือที่ทำงานสำหรับอีเมลด้วยการค้นหา Email.ENTERPRISE_CONTENT_LOOKUP_URI การค้นหา URL นี้จะเป็นการค้นหารายชื่อติดต่อส่วนบุคคลเพื่อหาข้อมูลที่ตรงกันทั้งหมดก่อน ถ้า ผู้ให้บริการไม่ตรงกับรายชื่อติดต่อส่วนตัวใดๆ แล้วผู้ให้บริการจะค้นหา รายชื่อติดต่อสำหรับงานที่ตรงกัน URI นี้พร้อมใช้งานใน Android 6.0 (API ระดับ 23) หรือสูงกว่า

วิธีค้นหาข้อมูลติดต่อสำหรับอีเมลมีดังนี้

Kotlin

// Build the URI to look up contacts from the personal and work profiles that
// are an exact (case-insensitive) match for the email address.
val emailAddress = "somebody@example.com"
val contentFilterUri =
  Uri.withAppendedPath(
    ContactsContract.CommonDataKinds.Email.ENTERPRISE_CONTENT_LOOKUP_URI,
    Uri.encode(emailAddress)
  )

// Query the content provider to first try to match personal contacts and,
// if none are found, then try to match the work contacts.
val cursor =
  contentResolver.query(
    contentFilterUri,
    arrayOf(
      ContactsContract.CommonDataKinds.Email.CONTACT_ID,
      ContactsContract.CommonDataKinds.Email.ADDRESS,
      ContactsContract.Contacts.DISPLAY_NAME
    ),
    null,
    null,
    null
  )
    ?: return

// Print the name of the matching contact. If we want to work-badge contacts,
// we can call ContactsContract.Contacts.isEnterpriseContactId() with the ID.
cursor.use {
  while (it.moveToNext()) {
    Log.i(TAG, "Matching contact: ${it.getString(2)}")
  }
}

Java

// Build the URI to look up contacts from the personal and work profiles that
// are an exact (case-insensitive) match for the email address.
String emailAddress = "somebody@example.com";
Uri contentFilterUri = Uri.withAppendedPath(
    ContactsContract.CommonDataKinds.Email.ENTERPRISE_CONTENT_LOOKUP_URI,
    Uri.encode(emailAddress));

// Query the content provider to first try to match personal contacts and,
// if none are found, then try to match the work contacts.
Cursor cursor = getContentResolver().query(
    contentFilterUri,
    new String[]{
        ContactsContract.CommonDataKinds.Email.CONTACT_ID,
        ContactsContract.CommonDataKinds.Email.ADDRESS,
        ContactsContract.Contacts.DISPLAY_NAME
    },
    null,
    null,
    null);
if (cursor == null) {
  return;
}

// Print the name of the matching contact. If we want to work-badge contacts,
// we can call ContactsContract.Contacts.isEnterpriseContactId() with the ID.
try {
  while (cursor.moveToNext()) {
    Log.i(TAG, "Matching contact: " + cursor.getString(2));
  }
} finally {
  cursor.close();
}

แสดงรายชื่อติดต่อที่ทำงาน

แอปที่ทำงานในโปรไฟล์ส่วนตัวจะแสดงการ์ดรายชื่อติดต่อในโปรไฟล์งานได้ โทร ContactsContract.QuickContact.showQuickContact() นิ้ว Android 5.0 ขึ้นไป เพื่อเปิดแอป Contacts ในโปรไฟล์งานและแสดง บัตรของรายชื่อติดต่อ

ในการสร้าง URI ที่ถูกต้องสำหรับโปรไฟล์งาน คุณต้องเรียกใช้ ContactsContract.Contacts.getLookupUri() และผ่านการตรวจสอบ รหัสรายชื่อติดต่อและคีย์การค้นหา ตัวอย่างต่อไปนี้แสดงวิธีรับ URI จากนั้นแสดงการ์ด

Kotlin

// Query the content provider using the ENTERPRISE_CONTENT_FILTER_URI address.
// We use the _ID and LOOKUP_KEY columns to generate a work-profile URI.
val cursor =
  getContentResolver()
    .query(
      contentFilterUri,
      arrayOf(ContactsContract.Contacts._ID, ContactsContract.Contacts.LOOKUP_KEY),
      null,
      null
    )

// Show the contact details card in the work profile's Contacts app. The URI
// must be created with getLookupUri().
cursor?.use {
  if (it.moveToFirst() == true) {
    val uri = ContactsContract.Contacts.getLookupUri(it.getLong(0), it.getString(1))
    ContactsContract.QuickContact.showQuickContact(
      activity,
      Rect(20, 20, 100, 100),
      uri,
      ContactsContract.QuickContact.MODE_LARGE,
      null
    )
  }
}

Java

// Query the content provider using the ENTERPRISE_CONTENT_FILTER_URI address.
// We use the _ID and LOOKUP_KEY columns to generate a work-profile URI.
Cursor cursor = getContentResolver().query(
    contentFilterUri,
    new String[] {
        ContactsContract.Contacts._ID,
        ContactsContract.Contacts.LOOKUP_KEY,
    },
    null,
    null,
    null);
if (cursor == null) {
  return;
}

// Show the contact details card in the work profile's Contacts app. The URI
// must be created with getLookupUri().
try {
  if (cursor.moveToFirst() == true) {
    Uri uri = ContactsContract.Contacts.getLookupUri(
        cursor.getLong(0), cursor.getString(1));
    ContactsContract.QuickContact.showQuickContact(
        getActivity(),
        new Rect(20, 20, 100, 100),
        uri,
        ContactsContract.QuickContact.MODE_LARGE,
        null);
  }
} finally {
  cursor.close();
}

ความพร้อมใช้งาน

ตารางต่อไปนี้จะสรุปเวอร์ชัน Android ที่รองรับโปรไฟล์งาน ข้อมูลติดต่อในโปรไฟล์ส่วนตัว

เวอร์ชันของ Android การสนับสนุน
5.0 (API ระดับ 21) ค้นหาหมายเลขโทรศัพท์ในรายชื่อติดต่อที่ทำงานโดยใช้ PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI
6.0 (API ระดับ 23) ค้นหาชื่อผู้ติดต่อของที่ทำงานสำหรับอีเมลโดยใช้ Email.ENTERPRISE_CONTENT_LOOKUP_URI
7.0 (API ระดับ 24) ค้นหาชื่อผู้ติดต่อของที่ทำงานจากไดเรกทอรีงานโดยใช้ Contacts.ENTERPRISE_CONTENT_FILTER_URI
แสดงรายการไดเรกทอรีทั้งหมดในโปรไฟล์ของที่ทำงานและโปรไฟล์ส่วนตัวโดยใช้ Directory.ENTERPRISE_CONTENT_URI

การพัฒนาและการทดสอบ

หากต้องการสร้างโปรไฟล์งาน ให้ทำตามขั้นตอนต่อไปนี้

  1. ติดตั้งแอป Test DPC
  2. เปิดแอปตั้งค่า Test DPC (ไม่ใช่ไอคอนแอป Test DPC)
  3. ทำตามวิธีการบนหน้าจอเพื่อตั้งค่าโปรไฟล์ที่มีการจัดการ
  4. ในโปรไฟล์งาน ให้เปิดแอปรายชื่อติดต่อและเพิ่มรายชื่อติดต่อตัวอย่าง

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

  1. เปิดแอป Test DPC ในโปรไฟล์งาน
  2. ค้นหาการตั้งค่าปิดใช้การค้นหารายชื่อติดต่อข้ามโปรไฟล์ หรือ การตั้งค่าปิดใช้หมายเลขผู้โทรข้ามโปรไฟล์
  3. เปลี่ยนการตั้งค่าเป็นเปิด

หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับการทดสอบแอปด้วยโปรไฟล์งาน โปรดอ่านทดสอบแอปสําหรับ ความเข้ากันได้กับโปรไฟล์งาน

แหล่งข้อมูลเพิ่มเติม

หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับรายชื่อติดต่อหรือโปรไฟล์งาน โปรดดูแหล่งข้อมูลต่อไปนี้