Android中联系人的信息是通过ContentProvider来供外部应用获取的,我们使用时只需根据系统联系人ContentProvider的Uri即可获取所需数据。
首先需要获取权限:
在清单文件中注册相应权限,
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
6.0以上需要动态获取权限。
1.获取所有联系人列表:
public static String[] getAllContacts() {
//联系人的Uri,也就是content://com.android.contacts/contacts
Uri uri = ContactsContract.Contacts.CONTENT_URI;
//指定获取_id和display_name两列数据,display_name即为姓名
String[] projection = new String[] {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME
};
//根据Uri查询相应的ContentProvider,cursor为获取到的数据集
Cursor cursor = this.getContentResolver().query(uri, projection, null, null, null);
String[] arr = new String[cursor.getCount()];
int i = 0;
if (cursor != null && cursor.moveToFirst()) {
do {
Long id = cursor.getLong(0);
//获取姓名
String name = cursor.getString(1);
//指定获取NUMBER这一列数据
String[] phoneProjection = new String[] {
ContactsContract.CommonDataKinds.Phone.NUMBER
};
arr[i] = id + " , 姓名:" + name;
//根据联系人的ID获取此人的电话号码
Cursor phonesCusor = this.getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
phoneProjection,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id,
null,
null);
//因为每个联系人可能有多个电话号码,所以需要遍历
if (phonesCusor != null && phonesCusor.moveToFirst()) {
do {
String num = phonesCusor.getString(0);
arr[i] += " , 电话号码:" + num;
}while (phonesCusor.moveToNext());
}
i++;
} while (cursor.moveToNext());
}
return arr;
}
2.根据电话号码查询联系人姓名
public static String getDisplayNameByNumber(Context context, String number) {
String name = null;
Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/" + number);
ContentResolver resolver = context.getContentResolver();
Cursor cursor = resolver.query(uri, new String[]{"display_name"}, null,
null, null);
if (cursor.moveToFirst()) {
name = cursor.getString(0);
}
if (cursor != null) {
cursor.close();
}
return name;
}
3.向通讯录中添加联系人
public static void addContact(Context context, String name, String phoneNumber) {
// 创建一个空的ContentValues
ContentValues values = new ContentValues();
// 向RawContacts.CONTENT_URI空值插入,
// 先获取Android系统返回的rawContactId
// 后面要基于此id插入值
Uri rawContactUri = context.getContentResolver().insert(ContactsContract.RawContacts.CONTENT_URI, values);
long rawContactId = ContentUris.parseId(rawContactUri);
values.clear();
values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
// 内容类型
values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
// 联系人名字
values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, name);
// 向联系人URI添加联系人名字
context.getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
values.clear();
values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
// 联系人的电话号码
values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phoneNumber);
// 电话类型
values.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);
// 向联系人电话号码URI添加电话号码
context.getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
values.clear();
//以下为插入e-mail信息,不需要可以注释掉
// values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId);
// values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE);
// // 联系人的Email地址
// values.put(ContactsContract.CommonDataKinds.Email.DATA, "zhangphil@xxx.com");
// // 电子邮件的类型
// values.put(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK);
// // 向联系人Email URI添加Email数据
// context.getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
Log.e("tag", "联系人数据添加成功");
}