Android 的联系人在一个数据库中维护并通过一个ContentProvider公开, 联系人API 使用一组 android.provider.ContactsContract 为根的接口和类, 本API 内容博大精深.
理解联系人表和它们的关联视图是理解联系人API 的关键。
以下几点认识
1. 打开联系人应用程序时看到的联系人称为聚合联系人. 每个聚合联系人的底层是原始联系人
2. 属于一个账户的一组联系人称为原始联系人. 而聚合联系人则相反,它跨越了账户边界,最终属于整个设备.
3. 要读取联系人,需要申明以下权限 android.permission.READ_CONTACTS
用于读取所有联系人的URI 为ContactsContract.Contacts.CONTENT_URI
联系人的查找URI : ContactsContract.Contacts.CONTENT_LOOKUP_URI, 每个查找URI 表示一组串联在一起的原始联系人身份.
根据联系人查找Uri 进行的查找返回一个聚合联系人,而不是原始联系人.
原始人联系人的URI: ContactsContract.RawContacts.CONTENT_URI
原始实体内容URI: ContactsContract.RawContactsEntity.CONTENT_URI
关于添加联系人和它的详细信息
要向联系人写入数据,需要声明以下权限 android.permission.WRITE_CONTACTS
添加联系人和详细信息的流程:
(1) 首先使用预定义账户的名称和类型向该账户添加一个新原始联系人,通过insertRawContact() 方法
(2) 获取原始联系人ID并在数据表中插入一个名称记录, 通过 insertName() 方法
(3) 获取原始联系人ID 并在数据表中插入一个电话号码记录,通过insertPhone() 方法
添加联系人代码 如下:
/**
* 向联系人添加详细信息
*
*/
public class AddContactFunctionTester extends ContactDataFunctionTester {
public AddContactFunctionTester(Context ctx, IReportBack target) {
super(ctx, target);
}
public void addContact() {
long rawContactId = insertRawContact();
this.mReportTo.reportBack(tag, "RawcontactId:" + rawContactId);
insertName(rawContactId);
insertPhoneNumber(rawContactId);
showRawContactsDataForRawContact(rawContactId);
}
private void insertName(long rawContactId) {
ContentValues cv = new ContentValues();
cv.put(Data.RAW_CONTACT_ID, rawContactId);
cv.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
cv.put(StructuredName.DISPLAY_NAME, "John Doe_" + rawContactId);
this.mContext.getContentResolver().insert(Data.CONTENT_URI, cv);
}
private void insertPhoneNumber(long rawContactId) {
ContentValues cv = new ContentValues();
cv.put(Data.RAW_CONTACT_ID, rawContactId);
cv.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
cv.put(Phone.NUMBER, "123 123 " + rawContactId);
cv.put(Phone.TYPE, Phone.TYPE_HOME);
this.mContext.getContentResolver().insert(Data.CONTENT_URI, cv);
}
private long insertRawContact() {
ContentValues cv = new ContentValues();
cv.put(RawContacts.ACCOUNT_TYPE, "com.google");
cv.put(RawContacts.ACCOUNT_NAME, "***@gmail.com");
Uri rawContactUri = this.mContext.getContentResolver().insert(
RawContacts.CONTENT_URI, cv);
if(rawContactUri != null) {
long rawContactId = ContentUris.parseId(rawContactUri);
return rawContactId;
}
return 0L;
}
private void showRawContactsDataForRawContact(long rawContactId) {
Cursor c = null;
try {
Uri uri = ContactsContract.RawContactsEntity.CONTENT_URI;
c = this.getACursor(uri, "_id = " + rawContactId);
this.printRawContactsData(c);
} finally {
if (c != null)
c.close();
}
}
}
代码示例请参见 TestContacts 工程