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 }

Android之获取联系人的更多相关文章

  1. android之读取联系人信息

    联系人信息被存放在一个contacts2.db的数据库中 主要的两张表 读取联系人 读取联系人需要知道联系人内容提供者的地址,以及对应的操作对象.一般情况下操作对象是的命名方式和表明是一致的. 布局文 ...

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

    前面的文章已经实现相关的布局,本文接着进行相关的功能实现 本文地址:http://www.cnblogs.com/wuyudong/p/5951794.html,转载请注明出处. 读取系统联系人 当点 ...

  3. android中ContentProvider获取联系人 总结

    35.内容提供者:ContentResolver 用内容提供者来获取联系人信息 35-1:权限 <!-- 对联系人的读.写权限 --> <uses-permission androi ...

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

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  5. 【Android Developers Training】 98. 获取联系人列表

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

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

    前言:前阵子主要是记录了如何对联系人的一些操作,比如搜索,全选.反选和删除等在实际开发中可能需要实现的功能,本篇博客是小巫从一个别人开源的一个项目抽取出来的部分内容,把它给简化出来,可以让需要的朋友清 ...

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

    // 取得Intent中的頭像 ivShowImage = (ImageView) findViewById(R.id.call_log_detail_contact_img); //通话电话号码获取 ...

  8. 【实用篇】获取Android通讯录中联系人信息

    第一步,在Main.xml布局文件中声明一个Button控件,布局文件代码如下: <LinearLayout xmlns:android="http://schemas.android ...

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

    public void testGetAllContact() throws Throwable { //获取联系人信息的Uri Uri uri = ContactsContract.Contacts ...

随机推荐

  1. mysql 交叉表

    交叉表,但在MySQL中却没有这个功能,但网上看到有不少朋友想找出一个解决方法,特发贴集思广义.http://topic.csdn.net/u/20090530/23/0b782674-4b0b-4c ...

  2. 咨询内容: TF卡一定要重新买吗,为什么我的放进去读不了呢

    京东回复:您好!先科(SAST) SA-992 便携数码音响 (兰色)不用重新买,但是需要您采用FAT分区重新格式化,感谢您对京东的支持!祝您购物愉快!

  3. BNU 51275 道路修建 Large 并查集

    分析(引入Q神题解  %%%Q) 如果使用可持久化并查集,二分答案判定连通性,复杂度是O(mlog3n),不能在时限内出解.考虑到并查集实际上是一棵树,可以尝试在边上维护一些信息,假设t时刻加了一条边 ...

  4. 用通俗的例子解释OAuth和OpenID的区别【原】

    什么是OAuth(Wiki) 什么是OpenID(Wiki) 详细的定义可以看wiki,下面举个例子说说我的理解 现在很多网站都可以用第三方的账号登陆,比如,现在我要登录淘宝买东西,而如果我没有淘宝的 ...

  5. IE兼容性问题解决方案3--css中的overflow

    overflow:hidden:IE8下没效果? width:100%;IE6.7.8下必须有宽带,而且不能是auto: weight:auto; overflow-x:scroll; overflo ...

  6. java创建对象的四种方式

    1.最常见的 new 一个 2使用反射机制创建对象,直接调用非构造函数 Class obj=Class.forName("A"); A a=obj.newInstance(); C ...

  7. ios开发中,A valid provisioning profile for this executable was not found,的解决方法

    手头上的一个ios项目在上架后,再进行时出现了以上的这个错误,这是上架后忘了对一些配置进行复原 我的项目解决方法是: 是上面的这一块出现了问题,图片上的配置是正常的情况,但是上架的时候对其进行了修改, ...

  8. CCF 认证4

    题意:求强联通分量 Tarjan算法 #include<iostream> #include<stdio.h> #include<stdlib.h> #includ ...

  9. Solution for latex error:”Unknown graphics extension: .eps“ or "Can not find XXX"

    Sample code: \begin{figure*} \centering % Requires \usepackage{graphicx} \includegraphics[width=7in] ...

  10. HDU-4686 Arc of Dream 构造矩阵

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4686 因为ai = ai-1*AX+AY ,bi = bi-1*BX+BY ,那么ai*bi=AX*B ...