ANDROID之获取联系人

Android入门中,记录学习中的遇到的问题和一些个人总结。

联系人数据库路径为:/data/data/com.android.providers.contacts/database/contacts2.db

权限问题:安卓6.0以上只是在XML中写权限还不够,代码中也需要写。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {   requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, 10); } 

public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {   if (requestCode == 10) {     if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {       //有权限,可以进行获取联系人操作    } else {       Toast.makeText(this, "您阻止了权限", Toast.LENGTH_SHORT).show();     } }


第一种方法,代码也最简洁,SORT_KEY_PRIMARY还能按中文名字拼音排序,个人推荐:

 1 Cursor cursor = context.getContentResolver().query(Phone.CONTENT_URI, new String[]{Phone.DISPLAY_NAME, Phone.NUMBER}, null, null, Phone.SORT_KEY_PRIMARY);
 2         if (cursor != null) {
 3             while (cursor.moveToNext()) {
 4                 ContactBean contact = new ContactBean();
 5                 contact.setName(cursor.getString(0));
 6                 contact.setPhone(cursor.getString(1));
 7                 lists.add(contact);
 8             }
 9             cursor.close();
10         }

第二种方法:可根据联系人id获取相关信息

 1 Uri uri = Uri.parse("content://com.android.contacts/contacts");
 2         ContentResolver resolver = context.getContentResolver();
 3         Cursor cursor = resolver.query(uri, new String[]{"_id"}, null, null, null);
 4         if (cursor != null && cursor.getCount() > 0){
 5             while (cursor.moveToNext()) {
 6                 Contact contact = new Contact();
 7                 int contactId = cursor.getInt(0);
 8                 uri = Uri.parse("content://com.android.contacts/contacts/" + contactId + "/data");
 9                 Cursor cursor1 = resolver.query(uri, new String[]{"mimetype", "data1"}, null, null, null);
10                 if (cursor1 != null && cursor1.getCount() > 0){
11                     while (cursor1.moveToNext()) {
12                         String mimeType = cursor1.getString(0);
13                         String data1 = cursor1.getString(1);
14                         if ("vnd.android.cursor.item/name".equals(mimeType)) { //是姓名
15                             contact.setName(data1);
16                         } else if ("vnd.android.cursor.item/phone_v2".equals(mimeType)) { //手机
17                             contact.setPhone(data1);
18                         }
19                     }
20                     cursor1.close();
21                     lists.add(contact);
22                 }
23             }
24             cursor.close();
25         }

第三种方法:跟第二种方法比较,只有第二个uri不同,(PS:此方法有BUG,获取到一部分人的数据为NULL,但联系人总数是一样的。据说是因为以前删除过联系人,本人手机未ROOT,也没法看数据库表的数据,希望有人能给个解释)

 1 Uri uri4Contacts = Uri.parse(ContactsContract.AUTHORITY_URI + "/contacts");
 2         Uri uri4Data = Uri.parse(ContactsContract.AUTHORITY_URI + "/data");
 3         List<Contact> lists = new ArrayList<>();
 4         Cursor cursor1 = context.getContentResolver().query(uri4Contacts, new String[]{"_id"}, null, null, null);
 5         if (cursor1.moveToNext()) {
 6             Contact contact = new Contact();
 7             String id = cursor1.getString(0);
 8             Cursor cursor2 = context.getContentResolver().query(uri4Data, new String[]{"data1", "mimetype"}, "row_contact_id = ?", new String[]{id}, null);
 9             if (cursor2.moveToNext()) {
10                 String data = cursor2.getString(0);
11                 String mimetype = cursor2.getString(1);
12                 if (mimetype.equals("vnd.android.cursor.item/name")) {
13                     contact.setName(data);
14                 } else if (mimetype.equals("vnd.android.cursor.item/phone_v2")) {
15                     contact.setPhone(data);
16                 }
17             }
18         }

时间: 2024-10-08 01:49:42

ANDROID之获取联系人的相关文章

android之获取联系人并按拼音排序

//获取联系人 //“display_name COLLATE LOCALIZED”:按姓名的拼音排序 Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, "display_name COLLATE LOCALIZED"); //遍历联系人 while(cursor.moveToNext()){ String phonesNumber=&q

android之读取联系人信息

联系人信息被存放在一个contacts2.db的数据库中 主要的两张表 布局文件 在布局文件中定义一个button按钮来获取触发获取联系人信息的事件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="ver

【Android Developers Training】 99. 获取联系人详细信息

注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer.android.com/training/contacts-provider/retrieve-details.html 这节课将会展示如何获取一个联系人的详细数据,比如电子邮件地址,电话号码,等等.当用户获得一个联系人后,他会想要查看他的详细信息.你可以展示给他们所有的信息,或者只展示某一特定类

Android 获取联系人手机号码、姓名、地址、公司、邮箱、生日

public void testGetAllContact() throws Throwable { //获取联系人信息的Uri Uri uri = ContactsContract.Contacts.CONTENT_URI; //获取ContentResolver ContentResolver contentResolver = ContactListActivity.this.getContentResolver(); //查询数据,返回Cursor Cursor cursor = con

Android通讯录管理(获取联系人、通话记录、短信消息)(二)

http://blog.csdn.net/wwj_748/article/details/19970271 Android通讯录管理(获取联系人.通话记录.短信消息)(二) 2014-02-26 11:40 9076人阅读 评论(11) 收藏 举报  分类: [Android通讯录模块开发](10)  版权声明:本文为博主原创文章,未经博主允许不得转载. Android通讯录管理(获取联系人.通话记录.短信消息)(二) 前言:上一篇博客介绍的是获取联系人的实现,本篇博客将介绍通话记录的实现. 同

android通过查询电话号码获取联系人信息

[java] view plaincopyprint? // 取得Intent中的頭像 ivShowImage = (ImageView) findViewById(R.id.call_log_detail_contact_img); //通话电话号码获取头像uri Uri uriNumber2Contacts = Uri .parse("content://com.android.contacts/" + "data/phones/filter/" + strPh

Android 手机卫士--获取联系人信息并显示与回显

前面的文章已经实现相关的布局,本文接着进行相关的功能实现 本文地址:http://www.cnblogs.com/wuyudong/p/5951794.html,转载请注明出处. 读取系统联系人 当点击“选择联系人”按钮后,弹出联系人列表,读取系统联系人分如下几个步骤: 系统联系人提供了一个内容提供者,通过内容解析器,匹配Url地址 1,内容解析器 2,Url地址,查看系统联系人数据库,内容提供者源码 先看api文档的清单文件,后看java类(联系人数据库有多张表) contents://com

Android获取联系人

package com.fyfeng.test; import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract.CommonDataKinds.Phone; import

关于ContentProvider的一些例子(获取联系人)

ContentResolver:是Android的四大组件之一,主要用于对外共享数据. Android提供了一些主要数据类型的ContentProvider,比如音频.视频.图片和私人通讯录等.前提是已经获取其权限. 主要方法 public boolean onCreate() 在创建ContentProvider时调用public Cursor query(Uri, String[], String, String[], String) 查询ContentProvider,返回一个Cursor