Android根据联系人姓名首字符顺序读取通讯录

版权声明:本文为Zhang Phil原创文章,欢迎转载!转载请注明出处:http://blog.csdn.net/zhangphil

本文给出了Android读取通讯录联系人的一般方法,且在读取Android通讯录联系人时候,将结果有序化(按照联系人姓名的首字符依次顺序读取:A ~ Z)。

读取的结果如图所示:

现给出实现该种Android通讯录读取的代码:

  1. package zhangphil.contacts;
  2. import java.util.ArrayList;
  3. import android.app.ListActivity;
  4. import android.content.ContentResolver;
  5. import android.content.Context;
  6. import android.database.Cursor;
  7. import android.net.Uri;
  8. import android.os.Bundle;
  9. import android.provider.ContactsContract;
  10. import android.view.LayoutInflater;
  11. import android.view.View;
  12. import android.view.ViewGroup;
  13. import android.widget.ArrayAdapter;
  14. import android.widget.ListView;
  15. import android.widget.TextView;
  16. public class MainActivity extends ListActivity {
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. ArrayList<Contact> contacts = new ArrayList<Contact>();
  21. readContacts(contacts);
  22. ListView listView = this.getListView();
  23. ArrayAdapter<Contact> adapter = new MyAdapter(this,
  24. android.R.layout.simple_list_item_2, contacts);
  25. listView.setAdapter(adapter);
  26. }
  27. private class MyAdapter extends ArrayAdapter<Contact> {
  28. private int resource;
  29. private LayoutInflater inflater = null;
  30. private ArrayList<Contact> contacts;
  31. public MyAdapter(Context context, int resource,
  32. ArrayList<Contact> contacts) {
  33. super(context, resource);
  34. this.resource = resource;
  35. this.contacts = contacts;
  36. inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  37. }
  38. @Override
  39. public View getView(int position, View convertView, ViewGroup parent) {
  40. if (convertView == null)
  41. convertView = inflater.inflate(resource, null);
  42. Contact c = getItem(position);
  43. TextView text1 = (TextView) convertView
  44. .findViewById(android.R.id.text1);
  45. TextView text2 = (TextView) convertView
  46. .findViewById(android.R.id.text2);
  47. //首字符,分组的依据。
  48. text1.setText(c.firstLetterOfName());
  49. //详情。
  50. text2.setText(c.name + " " + c.getPhoneNumbers());
  51. return convertView;
  52. }
  53. @Override
  54. public Contact getItem(int pos) {
  55. return contacts.get(pos);
  56. }
  57. @Override
  58. public int getCount() {
  59. return contacts.size();
  60. }
  61. }
  62. // 读取设备联系人的一般方法。大致流程就是这样,模板化的操作代码。
  63. private void readContacts(ArrayList<Contact> contacts) {
  64. Uri uri = Uri.parse("content://com.android.contacts/contacts");
  65. ContentResolver reslover = this.getContentResolver();
  66. // 在这里我们给query传递进去一个SORT_KEY_PRIMARY。
  67. // 告诉ContentResolver获得的结果安装联系人名字的首字母有序排列。
  68. Cursor cursor = reslover.query(uri, null, null, null,
  69. android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY);
  70. while (cursor.moveToNext()) {
  71. // 联系人ID
  72. String id = cursor
  73. .getString(cursor
  74. .getColumnIndex(android.provider.ContactsContract.Contacts._ID));
  75. // Sort Key,读取的联系人按照姓名从 A->Z 排序分组。
  76. String sort_key_primary = cursor
  77. .getString(cursor
  78. .getColumnIndex(android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY));
  79. // 获得联系人姓名
  80. String name = cursor
  81. .getString(cursor
  82. .getColumnIndex(android.provider.ContactsContract.Contacts.DISPLAY_NAME));
  83. Contact mContact = new Contact();
  84. mContact.id = id;
  85. mContact.name = name;
  86. mContact.sort_key_primary = sort_key_primary;
  87. // 获得联系人手机号码
  88. Cursor phone = reslover.query(
  89. ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
  90. ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "="
  91. + id, null, null);
  92. // 取得电话号码(可能存在多个号码)
  93. // 因为同一个名字下,用户可能存有一个以上的号,
  94. // 遍历。
  95. ArrayList<String> phoneNumbers = new ArrayList<String>();
  96. while (phone.moveToNext()) {
  97. int phoneFieldColumnIndex = phone
  98. .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
  99. String phoneNumber = phone.getString(phoneFieldColumnIndex);
  100. phoneNumbers.add(phoneNumber);
  101. }
  102. mContact.phoneNumbers = phoneNumbers;
  103. contacts.add(mContact);
  104. }
  105. }
  106. // 用于装载从联系人数据库中读取到的数据。
  107. // 结构化数据,便于数据操作和访问。
  108. private class Contact {
  109. public String id;
  110. public String name;
  111. public String sort_key_primary;
  112. public ArrayList<String> phoneNumbers;
  113. //获得一个联系人名字的首字符。
  114. //比如一个人的名字叫“安卓”,那么这个人联系人的首字符是:A。
  115. public  String  firstLetterOfName(){
  116. String s=sort_key_primary.charAt(0)+"";
  117. return  s.toUpperCase();
  118. }
  119. public String getPhoneNumbers() {
  120. String phones = " ";
  121. for (int i = 0; i < phoneNumbers.size(); i++) {
  122. phones += "号码" + i + ":" + phoneNumbers.get(i);
  123. }
  124. return phones;
  125. }
  126. }
  127. }

不要忘记在项目的AndroidManifest.xml文件中添加Android读写通讯录联系人的权限:

  1. <!-- 写权限 -->
  2. <uses-permission android:name="android.permission.WRITE_CONTACTS" />
  3. <!-- 读权限 -->
  4. <uses-permission android:name="android.permission.READ_CONTACTS" />

Android根据联系人姓名首字符顺序读取通讯录的更多相关文章

  1. Android 通过联系人姓名查询联系人号码

    <!-- 读联系人权限 --><uses-permission android:name="android.permission.READ_CONTACTS" / ...

  2. php多维数组排序方案。按照姓名 首字符 等排序

    //定义一个学生数组   $students = array(     256=>array('name'=>'jon','grade'=>98.5),     2=>arra ...

  3. Android 查看联系人电话和姓名(ContentProvider)

    1.介绍 2.使用方法 3.在AndroidManifest.xml文件中添加相关设置 <uses-permission android:name="android.permissio ...

  4. Android系统联系人全特效实现(上),分组导航和挤压动画

    记得在我刚接触Android的时候对系统联系人中的特效很感兴趣,它会根据手机中联系人姓氏的首字母进行分组,并在界面的最顶端始终显示一个当前的分组.如下图所示: 最让我感兴趣的是,当后一个分组和前一个分 ...

  5. android系统联系人分组特效实现(1)---分组导航和挤压动画

    1.打开activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/andr ...

  6. Android:联系人Contacts之ContentResolver query 参数详解

    注:本片整理自 http://blog.csdn.net/wssiqi/article/details/8132603 1.获取联系人姓名 一个简单的例子,这个函数获取设备上所有的联系人ID和联系人N ...

  7. android管理联系人操作

    ContentProvider扩展之管理系统联系人 我们都知道ContentProvider是用来共享数据的,然而android本身就提供了大量的ContentProvider,例如联系人信息,系统的 ...

  8. android系统联系人分组特效实现(2)---字母表快速滚动

    要实现这种功能,只需要在   android系统联系人分组特效实现(1)---分组导航和挤压动画  的基础上再加上一个自定义控件即可完成. 1.新建项目,继续新建一个java类,BladeView,用 ...

  9. Android系统联系人全特效实现(下),字母表快速滚动

    在上一篇文章中,我和大家一起实现了类似于Android系统联系人的分组导航和挤压动画功能,不过既然文章名叫做<Android系统联系人全特效实现>,那么没有快速滚动功能显然是称不上&quo ...

随机推荐

  1. Linux课程---14、linux下lamp环境如何安装

    Linux课程---14.linux下lamp环境如何安装 一.总结 一句话总结: 要按顺序安装,比如apache需要在php之前安装, 一.安装 gcc 编译器 二.卸载 rpm 安装的 http ...

  2. python的起源及基本语句

    一.Python的起源 Python是吉多范罗苏姆于1989年的圣诞节期间在阿姆斯特丹进行编写的,于1991年编写完成,Python是一门解释型弱类型的编程语言. Python在多个领域中都有应用,比 ...

  3. 云-腾讯云-云点播:云点播(VOD)

    ylbtech-云-腾讯云-云点播:云点播(VOD) 提供端到端的一站式VpaaS音视频点播解决方案 1.返回顶部 1. 云点播(Video on Demand,VOD)基于腾讯多年技术积累与基础设施 ...

  4. day23_4_hashlib

    #!/usr/bin/env python # -*- coding:utf-8 -*- # ----------------------------------------------------- ...

  5. 移动端click点透bug

    移动端click点透bug click点透bug有一个特定的产生情况: 当上层元素是tap事件,且tap后消失,下层元素是click事件.这个时候,tap上层元素的时候就会触发下层元素的click事件 ...

  6. 三种方法实现MNIST 手写数字识别

    MNIST数据集下载: import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist ...

  7. js文件操作之——导出Excel (js-xlsx)

    前阵子跟server同学讨论一个Excel导出的需求,我说JS搞不定,需要server来做,被server同学强行打脸. 今天研究了下,尼玛,不光可以,还很强大了! 总结:经验是害人的,尤其是在发展迅 ...

  8. 17.获取代理ip

    import redis import telnetlib import urllib.request from bs4 import BeautifulSoup r = redis.Redis(ho ...

  9. C# 字符串string和内存流MemoryStream及比特数组byte[]之间相互转换

    定义string变量为str,内存流变量为ms,比特数组为bt 1.字符串转比特数组 复制代码 代码如下: (1)byte[] bt=System.Text.Encoding.Default.GetB ...

  10. RunLoop运行循环机制

    http://www.jianshu.com/p/0be6be50e461 基本概念 进程 进程是指在系统中正在运行的一个应用程序,而且每个进程之间是独立的,它们都运行在其专用且受保护的内存空间内,比 ...