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. django2 连接mysql实现第一个rest framework

    1.安装pymysql,mysqlclient,创建项目django-admin startproject django2 2.settings中把DataBase配置换掉 DATABASES = { ...

  2. 固定定位fixed,绝对定位absolute,相对定位relative;以及overflow

    固定定位position:fixed /*固定定位 1.定位属性值:fixed 2.在页面中不再占位(浮起来了) 3.一旦定位后,定位的布局方位 top.bottom.left.right都能参与布局 ...

  3. Sublime text2 + cygwin编译C++

    1.安装cygwin2.安装sublime text23.将g++和gdb加入系统环境变量(windows系统)3.安装package control4.通过package control安装subl ...

  4. PAT甲级——A1138 Postorder Traversa【25】

    Suppose that all the keys in a binary tree are distinct positive integers. Given the preorder and in ...

  5. (转)Linux使用RSA密钥登录远程服务器

    一切操作都在本机执行,不需要进入远程主机/服务器~~ 1.生成密钥.默认生成的是rsa加密. ssh-keygen 2.私钥是给本地的,公钥是给远程的.下面将公钥上传到远程服务器 ~ ssh-copy ...

  6. 解决Spring Boot Configuration Annotation Processor not found in classpath

    问题截图: 解决方式: 在pom.xml文件中添加这些依赖 <dependency> <groupId>org.springframework.boot</groupId ...

  7. 下面分享一下RHEL/CentOS7 安装图形化桌面详细图解

    Linux是一个多任务的多用户的操作系统,好多linux爱好者在安装完linux后经常遇到一个问题——没有图形化桌面(http://www.xcmnyy.com)今天小编在安装RHEL7的时候,一步留 ...

  8. C++ Builder VCL库函数简介

    C++ Builder VCL库函数简介 2002-07-05· · ··C++builder资源中心 1 2 3 下一页 一.BORLAND C++ BUILDER VCL的内存管理函数 1. Al ...

  9. LUOGU P2764 最小路径覆盖问题 (最小路径点覆盖)

    解题思路 有向图最小路径点覆盖问题,有这样的结论就是有向图最小路径点覆盖等于n-拆点二分图中最大匹配.具体怎么证明不太知道..输出方案时找到所有左部未匹配的点一直走$match​$就行了. #incl ...

  10. javaweb的几种开发模式

    1.MVC模式基础 1.1.MVC模式简介 MVC是一种架构型模式,它本身并不引入新的功能,只是用来指导我们改善应用程序的架构,使得应用的模型和视图相分离,从而达到更好的开发和维护效率.在MVC模式中 ...