#### 权限
~~~
<uses-permission android:name="android.permission.READ_CONTACTS"/>
~~~
#### 跳转到通讯录
~~~
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, 1);
~~~
#### 定义通用方法
~~~
private List<String> getContactPhone(Cursor cursor) {
// phoneNum 如果值为1,则该联系人至少有一个电话号码;如果值为0,则该联系人没有电话号码
int phoneColumn = cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER);
int phoneNum = cursor.getInt(phoneColumn);
List<String> phoneResult = new ArrayList<String>();
if (phoneNum > 0) {
// contactId 获得联系人的ID号
int idColumn = cursor.getColumnIndex(ContactsContract.Contacts._ID);
String contactId = cursor.getString(idColumn);
// 获得联系人的电话号码的cursor;
Cursor phones = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = "
+ contactId, null, null);
if (phones.moveToFirst()) {
// 遍历所有的电话号码
for (; !phones.isAfterLast(); phones.moveToNext()) {
int index = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
// int typeindex = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
// phone_type 原生系统 mobile是2,home是1,work是3,other是7. 其他安卓系统做了部分变更,但大部分mobile都是2
// int phone_type = phones.getInt(typeindex);
// 如果要姓名使用 phoneName=phones.getString(phones.getColumnIndex(PhoneLookup.DISPLAY_NAME));
String phoneNumber = phones.getString(index);
phoneResult.add(phoneNumber);
}
if (!phones.isClosed()) {
phones.close();
}
}
}
return phoneResult;
}
~~~
#### 回调方法
~~~
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Uri uri = data.getData();
// 得到ContentResolver对象
ContentResolver cr = getContentResolver();
// 取得电话本中开始一项的光标
// 参数含义
// uri fromtable_name 指定查询某个应用程序下的某一张表
// projection selectcolumn1,column2 指定查询的列名
// selection wherecolumn=value 指定where的约束条件
// selectionArgs - 为where中的占位符提供具体的值
// orderBy orderbycolumn1,column2 指定查询结果的排序方式
Cursor cursor = cr.query(uri, null, null, null, null);
cursor.moveToFirst();
List<String> nums = getContactPhone(cursor);
tv_phones.setText(nums.toString());
}
~~~
#### 字段说明
网上找的,不全对。相对详细的可点击[这里](http://patmusing.blog.163.com/blog/static/135834960201101511521145/)
~~~
* ContactsContract.Contacts.TIMES_CONTACTED= "times_contacted" (int) 联系人被联系的次数
* ContactsContract.Contacts.CONTACT_STATUS= "contact_status" (string) 联系人最新的状态
* ContactsContract.Contacts.CUSTOM_RINGTONE= "custom_ringtone" (string uri) 自定义的联系人的铃声,如果没有定义该属性,则使用系统默认的铃声
* ContactsContract.Contacts.HAS_PHONE_NUMBER= "has_phone_number" (0 or1) 如果值为1,则该联系人至少有一个电话号码;如果值为0,则该联系人没有电话号码
* ContactsContract.Contacts.PHONETIC_NAME= "phonetic_name" 拼音样式全称发音
* ContactsContract.Contacts.PHONETIC_NAME_STYLE= "phonetic_name_style" 拼音字母
* ContactsContract.Contacts.CONTACT_STATUS_LABEL= "contact_status_label" (long) 联系人状态标签的ID号
* ContactsContract.Contacts.LOOKUP_KEY= "lookup" (string) 联系人的查询键
* ContactsContract.Contacts.CONTACT_STATUS_ICON= "contact_status_icon" (long) 联系人状态图标的ID号
* ContactsContract.Contacts.LAST_TIME_CONTACTED= "last_time_contacted" (long) 联系人最近被联系的时间
* ContactsContract.Contacts.DISPLAY_NAME= "display_name" (string) 联系人的姓名
* ContactsContract.Contacts.SORT_KEY_ALTERNATIVE= "sort_key_alt" family name first方式的排序
* ContactsContract.Contacts.IN_VISIBLE_GROUP= "in_visible_group" 分组样式
* ContactsContract.Contacts._ID ="_id" (long) 联系人的id
* ContactsContract.Contacts.STARRED= "starred" (int, 0/1) 1表示该联系人是用星号标记的,即favorite的联系人;0表示没有用星号标记
* ContactsContract.Contacts.SORT_KEY_PRIMARY= "sort_key" 本地的排序关键字
* ContactsContract.Contacts.DISPLAY_NAME_ALTERNATIVE= "display_name_alt" 显示名称的另一种表示形式 such as"family name first" instead of "given name first" forWestern names
* ContactsContract.Contacts.CONTACT_PRESENCE= "contact_presence" 联系人呈现出来的状态,如离线、在线、忙碌等状态
* ContactsContract.Contacts.DISPLAY_NAME_SOURCE= "display_name_source" 用于联系人的显示名称的数据类型
* ContactsContract.Contacts.CONTACT_STATUS_RES_PACKAGE= "contact_status_res_package" 包含状态的资源的包:标签和图标。
* ContactsContract.Contacts.CONTACT_STATUS_TIMESTAMP= "contact_status_ts" 插入/更新最新状态的时间
* ContactsContract.Contacts.PHOTO_ID= "photo_id" (long) 联系人头像id
* ContactsContract.Contacts.SEND_TO_VOICEMAIL= "send_to_voicemail" (int,0/1) 如果值为1,则该联系人应该总是被发送到vociemail中,默认值为0
*
~~~