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" />

最新文章

  1. springboot Serving Web Content with Spring MVC
  2. HCTF时PHP WAF然有RLFI漏洞
  3. Maven联网问题
  4. ssh config host
  5. Mac删除.DS_Store文件
  6. C#/net 使用Protocol Buffers入门
  7. js模版引擎handlebars.js实用教程——with-进入到某个属性(进入到某个上下文环境)
  8. myeclipse和eclipse安装Java反编译插件
  9. ajax+XMLHttpRequest里的FormData实现图片异步上传
  10. .net抓取网页数据
  11. SessionFactory的创建和Session的获得
  12. Yii Framework2.0开发教程(4)在yii中定义全局变量
  13. [Swift]LeetCode8. 字符串转整数 (atoi) | String to Integer (atoi)
  14. socket keepalive理解
  15. 安装FrameWork后重新注册IIS
  16. 精读Hadamard Response论文
  17. GENIL_BOL_BROWSER 中显示的Object Name 是root object的名字
  18. Linux上printf命令的用法
  19. prayer OJ M
  20. python中numpy计算数组的行列式numpy.linalg.det()

热门文章

  1. JSOI 2008 魔兽地图
  2. linux如何查看防火墙是否开启?删除iptables规则
  3. js实现前端动态筛选表格内容
  4. java接口的意义,为什么接口可以多继承,而类不可以?
  5. SpringBoot--springboot启动类和controller的配置
  6. 17.splash_case01
  7. 2_2.springboot2.x配置之自动配置原理
  8. PropertyPlaceholderConfigurer的注意事项
  9. springcloud Finchley 版本hystrix 和 hystrix Dashboard
  10. 网页qq在线交谈