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. platform模块和ctypes模块

    一.ctypes模块 Python 的 ctypes 要使用 C 函数,需要先将 C 编译成动态链接库的形式,即 Windows 下的 .dll 文件,或者 Linux 下的 .so 文件.先来看一下 ...

  2. hexo next主题中遇到的关于require的timeout的问题。Uncaught Error: Load timeout for modules:

    个人博客:https://mmmmmm.me 源码:https://github.com/dataiyangu/dataiyangu.github.io 背景 报错:Uncaught Error: L ...

  3. 使用gulp搭建less编译环境

    什么是less? 一种 动态 样式 语言. LESS 将 CSS 赋予了动态语言的特性,如 变量, 继承, 运算, 函数. LESS 既可以在 客户端 上运行 (支持IE 6+, Webkit, Fi ...

  4. C#实现拍照并且存水印照片

    由于一直在高校工作,就涉及到招生工作,招生时候又要收集学生图像采集,所以就随手写了一个图像采集工具,废话不多说,进入正题. 图像采集需要调用摄像头就行拍照操作,网上查了一下资料,需要引用以下3个dll ...

  5. LightOJ-1214-Large Division-大数取余

    Given two integers, a and b, you should check whether a is divisible by b or not. We know that an in ...

  6. 滑雪 矩阵中的最长上升路径 /// 记忆化DFS || DP oj22919

    大致题意: Description 难怪Michael喜欢滑雪,因为滑雪确实很刺激.为了获得加速度,滑雪道必须向下倾斜,而且当滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一 ...

  7. wdatapicker 时间选择器——例

    效果: html: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  8. (转)nginx配置location总结及rewrite规则写法

    注: rewrite 只能对域名后边的除去传递的参数外的字符串起作用,并且要写全域名后面的部分,如: http://i.com:9090/php/midou/admin.php/index/login ...

  9. Linux定时重启

      1.安装crontabyum install cixie-cron  yum install crontabs    2.编辑cron第一步,登陆账号第二步,输入crontab -e第三步,输入i ...

  10. python+selenium中webdriver相关资源

    Chrome chrome的webdriver :  http://chromedriver.storage.googleapis.com/index.html chrome的webdriver需要对 ...