Android ContactsContract

1. 简介

Android ContactsContract 是一个用于访问和管理设备上联系人数据的框架。它提供了一组接口和常量,用于读取和写入联系人的详细信息,包括姓名、电话号码、电子邮件地址等。本文将介绍 ContactsContract 框架的基本概念和使用方法,并给出一些常见的代码示例。

2. ContactsContract 基本概念

ContactsContract 是 Android 系统中访问联系人数据的标准接口。它定义了一组常量和 URI(Uniform Resource Identifier),用于访问联系人数据。以下是一些常见的 ContactsContract 常量和 URI:

  • ContactsContract.Contacts.CONTENT_URI:联系人的基本 URI,用于访问所有联系人的信息。
  • ContactsContract.CommonDataKinds.Phone.CONTENT_URI:电话号码的 URI,用于访问联系人的电话号码。
  • ContactsContract.CommonDataKinds.Email.CONTENT_URI:电子邮件地址的 URI,用于访问联系人的电子邮件地址。

ContactsContract 通过 Content Provider 实现对联系人数据的访问。Content Provider 是 Android 平台上的一种机制,用于共享应用程序数据。ContactsContract 中的数据通过 Content Provider 提供给应用程序访问和操作。

3. 读取联系人数据

要读取联系人数据,我们可以通过 ContentResolver 的 query() 方法来执行查询操作。以下是一个简单的代码示例,演示了如何使用 ContactsContract 读取联系人的姓名和电话号码:

// 查询联系人的姓名和电话号码
Cursor cursor = getContentResolver().query(
    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
    new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER},
    null,
    null,
    null
);

if (cursor != null && cursor.moveToFirst()) {
    do {
        String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
        String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        Log.d(TAG, "Name: " + name + ", Number: " + number);
    } while (cursor.moveToNext());
}

if (cursor != null) {
    cursor.close();
}

以上代码中,我们使用了 ContentResolver.query() 方法执行查询操作。第一个参数是要查询的 URI,这里我们使用了 ContactsContract.CommonDataKinds.Phone.CONTENT_URI 来查询联系人的电话号码。第二个参数是要返回的列,这里我们指定了要返回的姓名和电话号码列。第三个参数是查询条件,这里我们没有指定任何条件,所以为 null。第四个和第五个参数是排序和分组条件,这里我们也没有指定,所以为 null。查询结果返回的是一个 Cursor 对象,我们可以通过它来遍历联系人数据。

4. 写入联系人数据

要写入联系人数据,我们可以通过 ContentResolver 的 insert() 方法来执行插入操作。以下是一个简单的代码示例,演示了如何使用 ContactsContract 写入联系人的姓名和电话号码:

// 创建一个新的联系人
Uri contactUri = ContactsContract.RawContacts.CONTENT_URI;
ContentValues values = new ContentValues();
Uri newContactUri = getContentResolver().insert(contactUri, values);

// 获取新联系人的 ID
long contactId = ContentUris.parseId(newContactUri);

// 添加联系人的姓名
values.clear();
values.put(ContactsContract.Data.RAW_CONTACT_ID, contactId);
values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
values.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, "John Doe");
getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);

// 添加联系人的电话号码
values.clear();
values.put(ContactsContract.Data.RAW_CONTACT_ID, contactId);
values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, "1234567890");
values.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);
getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);

以上代码中,我们首先通过 ContentResolver.insert() 方法插入一个新的联系人。然后,我们获取新联系人的 ID,并使用 ContentValues 来设置联系人的姓名和电话号码。最后,通过 ContentResolver.insert() 方法将联系人的姓名和电话号码