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. Java中的栈,堆,方法区和常量池

    要说Java中的栈,堆,方法区和常量池就要提到HotSpot,HotSpot是Sun JDK 和 Open JDK中所带的虚拟机. (Sun JDK 和 Open JDK除了注释不同,代码实现基本上是 ...

  2. tyvj 1194 划分大理石(多重背包)

    传送门 解题思路 二进制优化多重背包裸题. 代码 #include<iostream> #include<cstdio> #include<cstring> #in ...

  3. Sublime Text 3,有了Anaconda就会如虎添翼

    作为Python开发环境的Sublime Text 3,有了Anaconda就会如虎添翼.Anaconda是目前最流行也是最有威力的Python代码提示插件. 操作步骤 1.打开package con ...

  4. 委托_deleget

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. 一个小村庄的烦恼(netty-nio)

    背景:一座大山有个小村庄,住着几百户人家,隔着大山那边几十里山路,有个小集市,家家户户经常翻山越岭买日用品,苦不堪言(同步阻塞,单线程,每户人家一个线程,去赶集了,今天也干不了别的活). 后来村长看着 ...

  6. Lost's revenge HDU - 3341 AC自动机+DP(需要学会如何优雅的压缩状态)

    题意: 给你n个子串和一个母串,让你重排母串最多能得到多少个子串出现在重排后的母串中. 首先第一步肯定是获取母串中每个字母出现的次数,只有A T C G四种. 这个很容易想到一个dp状态dp[i][A ...

  7. POJ - 2774~POJ - 3415 后缀数组求解公共字串问题

    POJ - 2774: 题意: 求解A,B串的最长公共字串 (摘自罗穗骞的国家集训队论文): 算法分析: 字符串的任何一个子串都是这个字符串的某个后缀的前缀. 求 A 和 B 的最长 公共子串等价于求 ...

  8. pycharm IDE在导入自定义模块时提示有错,但实际没错

    在建立python项目时,有时为了区分资源和代码,如在项目文件夹下新建img和src两个文件夹,这时导入自定义模块会提示错误,结果没错但感觉别扭.如: 这是因为pycharm提示功能是从根目录上去寻找 ...

  9. nput="file" 浏览时只显示指定excel文件,筛选特定文件类型

    <p>显示 .xls, .xlsx, .csv 文件...</p><input type="file" accept=".csv, appl ...

  10. Aria2 使用

    没错,又是受够了迅雷.旋风的各种奇葩减速(哥哥我还买了了VIP!),IDM 对协议支持又太少还有事没事提示你不是正版三天两头闹着要更新.于是我想起来之前看到过的 Aria2,虽然之前也只是略有耳闻,但 ...