选择联系人
如需让用户选择联系人和为您的应用提供对所有联系人信息的访问权限,请使用 ACTION_PICK
操作,并将 MIME 类型指定为 Contacts.CONTENT_TYPE
。
传送至您的 onActivityResult()
回调的结果 Intent
包含指向所选联系人的 content:
URI。响应会利用 Contacts Provider API 为您的应用授予该联系人的临时读取权限,即使您的应用不具备 READ_CONTACTS
权限也没有关系。
提示:如果您只需要访问某一条联系人信息(如电话号码或电子邮件地址),请改为参见下一节的内容,其中介绍了如何选择特定联系人数据。
-
操作
-
ACTION_PICK
数据 URI 架构
- 无 MIME 类型
-
Contacts.CONTENT_TYPE
示例 Intent:
static final int REQUEST_SELECT_CONTACT = 1;
public void selectContact() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, REQUEST_SELECT_CONTACT);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) {
Uri contactUri = data.getData();
// Do something with the selected contact at contactUri
...
}
}
如需了解有关在获得联系人 URI 后如何检索联系人详情的信息,请阅读检索联系人详情。 请谨记,使用以上 Intent 检索联系人 URI 时,读取该联系人的详情并不需要 READ_CONTACTS
权限。
选择特定联系人数据
如需让用户选择某一条联系人信息,如电话号码、电子邮件地址或其他数据类型,请使用ACTION_PICK
操作,并将 MIME 类型指定为下列其中一个内容类型(如 CommonDataKinds.Phone.CONTENT_TYPE
),以获取联系人的电话号码。
如果您只需要检索一种类型的联系人数据,则将此方法与来自 ContactsContract.CommonDataKinds
类的 CONTENT_TYPE
配合使用要比使用Contacts.CONTENT_TYPE
(如上一部分中所示)更高效,因为结果可让您直接访问所需数据,无需对联系人提供程序执行更复杂的查询。
传送至您的 onActivityResult()
回调的结果 Intent
包含指向所选联系人数据的 content:
URI。响应会为您的应用授予该联系人数据的临时读取权限,即使您的应用不具备 READ_CONTACTS
权限也没有关系。
-
操作
-
ACTION_PICK
数据 URI 架构
- 无 MIME 类型
-
- 从有电话号码的联系人中选取。
- 从有电子邮件地址的联系人中选取。
- 从有邮政地址的联系人中选取。
CommonDataKinds.Phone.CONTENT_TYPE
CommonDataKinds.Email.CONTENT_TYPE
CommonDataKinds.StructuredPostal.CONTENT_TYPE
或者
ContactsContract
下众多其他CONTENT_TYPE
值中的一个。
示例 Intent:
static final int REQUEST_SELECT_PHONE_NUMBER = 1;
public void selectContact() {
// Start an activity for the user to pick a phone number from contacts
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(CommonDataKinds.Phone.CONTENT_TYPE);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == RESULT_OK) {
// Get the URI and query the content provider for the phone number
Uri contactUri = data.getData();
String[] projection = new String[]{CommonDataKinds.Phone.NUMBER};
Cursor cursor = getContentResolver().query(contactUri, projection,
null, null, null);
// If the cursor returned is valid, get the phone number
if (cursor != null && cursor.moveToFirst()) {
int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER);
String number = cursor.getString(numberIndex);
// Do something with the phone number
...
}
}
}
查看联系人
如需显示已知联系人的详情,请使用 ACTION_VIEW
操作,并使用 content:
URI 作为 Intent 数据指定联系人。
初次检索联系人 URI 的方法主要有两种:
- 使用
ACTION_PICK
返回的联系人 URI,如上一节所示(此方法不需要任何应用权限) - 直接访问所有联系人的列表,如检索联系人列表所述(此方法需要
READ_CONTACTS
权限)
-
操作
-
ACTION_VIEW
数据 URI 架构
-
content:<URI>
MIME 类型
- 无。该类型是从联系人 URI 推断得出。
示例 Intent:
public void viewContact(Uri contactUri) {
Intent intent = new Intent(Intent.ACTION_VIEW, contactUri);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
编辑现有联系人
如需编辑已知联系人,请使用 ACTION_EDIT
操作,使用 content:
URI 作为 Intent 数据指定联系人,并将 extra 中由常量指定的任何已知联系人信息包括在ContactsContract.Intents.Insert
中。
初次检索联系人 URI 的方法主要有两种:
- 使用
ACTION_PICK
返回的联系人 URI,如上一节所示(此方法不需要任何应用权限) - 直接访问所有联系人的列表,如检索联系人列表所述(此方法需要
READ_CONTACTS
权限)
-
操作
-
ACTION_EDIT
数据 URI 架构
-
content:<URI>
MIME 类型
- 该类型是从联系人 URI 推断得出。 Extra
-
ContactsContract.Intents.Insert
中定义的一个或多个 extra,以便您填充联系人详情字段。
示例 Intent:
public void editContact(Uri contactUri, String email) {
Intent intent = new Intent(Intent.ACTION_EDIT);
intent.setData(contactUri);
intent.putExtra(Intents.Insert.EMAIL, email);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
如需了解有关如何编辑联系人的详细信息,请阅读使用 Intent 修改联系人。
插入联系人
如需插入新联系人,请使用 ACTION_INSERT
操作,将 Contacts.CONTENT_TYPE
指定为 MIME 类型,并将 extra 中由常量指定的任何已知联系人信息包括在ContactsContract.Intents.Insert
中。
-
操作
-
ACTION_INSERT
数据 URI 架构
- 无 MIME 类型
-
Contacts.CONTENT_TYPE
Extra
-
ContactsContract.Intents.Insert
中定义的一个或多个 extra。
示例 Intent:
public void insertContact(String name, String email) {
Intent intent = new Intent(Intent.ACTION_INSERT);
intent.setType(Contacts.CONTENT_TYPE);
intent.putExtra(Intents.Insert.NAME, name);
intent.putExtra(Intents.Insert.EMAIL, email);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
如需了解有关如何插入联系人的详细信息,请阅读 使用 Intent 修改联系人 。