ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
#### 权限 ~~~ <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 * ~~~