Android根据联系人姓名首字符顺序读取通讯录
版权声明:本文为Zhang Phil原创文章,欢迎转载!转载请注明出处:http://blog.csdn.net/zhangphil
本文给出了Android读取通讯录联系人的一般方法,且在读取Android通讯录联系人时候,将结果有序化(按照联系人姓名的首字符依次顺序读取:A ~ Z)。
读取的结果如图所示:
现给出实现该种Android通讯录读取的代码:
- package zhangphil.contacts;
- import java.util.ArrayList;
- import android.app.ListActivity;
- import android.content.ContentResolver;
- import android.content.Context;
- import android.database.Cursor;
- import android.net.Uri;
- import android.os.Bundle;
- import android.provider.ContactsContract;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.ArrayAdapter;
- import android.widget.ListView;
- import android.widget.TextView;
- public class MainActivity extends ListActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ArrayList<Contact> contacts = new ArrayList<Contact>();
- readContacts(contacts);
- ListView listView = this.getListView();
- ArrayAdapter<Contact> adapter = new MyAdapter(this,
- android.R.layout.simple_list_item_2, contacts);
- listView.setAdapter(adapter);
- }
- private class MyAdapter extends ArrayAdapter<Contact> {
- private int resource;
- private LayoutInflater inflater = null;
- private ArrayList<Contact> contacts;
- public MyAdapter(Context context, int resource,
- ArrayList<Contact> contacts) {
- super(context, resource);
- this.resource = resource;
- this.contacts = contacts;
- inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- if (convertView == null)
- convertView = inflater.inflate(resource, null);
- Contact c = getItem(position);
- TextView text1 = (TextView) convertView
- .findViewById(android.R.id.text1);
- TextView text2 = (TextView) convertView
- .findViewById(android.R.id.text2);
- //首字符,分组的依据。
- text1.setText(c.firstLetterOfName());
- //详情。
- text2.setText(c.name + " " + c.getPhoneNumbers());
- return convertView;
- }
- @Override
- public Contact getItem(int pos) {
- return contacts.get(pos);
- }
- @Override
- public int getCount() {
- return contacts.size();
- }
- }
- // 读取设备联系人的一般方法。大致流程就是这样,模板化的操作代码。
- private void readContacts(ArrayList<Contact> contacts) {
- Uri uri = Uri.parse("content://com.android.contacts/contacts");
- ContentResolver reslover = this.getContentResolver();
- // 在这里我们给query传递进去一个SORT_KEY_PRIMARY。
- // 告诉ContentResolver获得的结果安装联系人名字的首字母有序排列。
- Cursor cursor = reslover.query(uri, null, null, null,
- android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY);
- while (cursor.moveToNext()) {
- // 联系人ID
- String id = cursor
- .getString(cursor
- .getColumnIndex(android.provider.ContactsContract.Contacts._ID));
- // Sort Key,读取的联系人按照姓名从 A->Z 排序分组。
- String sort_key_primary = cursor
- .getString(cursor
- .getColumnIndex(android.provider.ContactsContract.Contacts.SORT_KEY_PRIMARY));
- // 获得联系人姓名
- String name = cursor
- .getString(cursor
- .getColumnIndex(android.provider.ContactsContract.Contacts.DISPLAY_NAME));
- Contact mContact = new Contact();
- mContact.id = id;
- mContact.name = name;
- mContact.sort_key_primary = sort_key_primary;
- // 获得联系人手机号码
- Cursor phone = reslover.query(
- ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
- ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "="
- + id, null, null);
- // 取得电话号码(可能存在多个号码)
- // 因为同一个名字下,用户可能存有一个以上的号,
- // 遍历。
- ArrayList<String> phoneNumbers = new ArrayList<String>();
- while (phone.moveToNext()) {
- int phoneFieldColumnIndex = phone
- .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
- String phoneNumber = phone.getString(phoneFieldColumnIndex);
- phoneNumbers.add(phoneNumber);
- }
- mContact.phoneNumbers = phoneNumbers;
- contacts.add(mContact);
- }
- }
- // 用于装载从联系人数据库中读取到的数据。
- // 结构化数据,便于数据操作和访问。
- private class Contact {
- public String id;
- public String name;
- public String sort_key_primary;
- public ArrayList<String> phoneNumbers;
- //获得一个联系人名字的首字符。
- //比如一个人的名字叫“安卓”,那么这个人联系人的首字符是:A。
- public String firstLetterOfName(){
- String s=sort_key_primary.charAt(0)+"";
- return s.toUpperCase();
- }
- public String getPhoneNumbers() {
- String phones = " ";
- for (int i = 0; i < phoneNumbers.size(); i++) {
- phones += "号码" + i + ":" + phoneNumbers.get(i);
- }
- return phones;
- }
- }
- }
不要忘记在项目的AndroidManifest.xml文件中添加Android读写通讯录联系人的权限:
- <!-- 写权限 -->
- <uses-permission android:name="android.permission.WRITE_CONTACTS" />
- <!-- 读权限 -->
- <uses-permission android:name="android.permission.READ_CONTACTS" />
Android根据联系人姓名首字符顺序读取通讯录的更多相关文章
- Android 通过联系人姓名查询联系人号码
<!-- 读联系人权限 --><uses-permission android:name="android.permission.READ_CONTACTS" / ...
- php多维数组排序方案。按照姓名 首字符 等排序
//定义一个学生数组 $students = array( 256=>array('name'=>'jon','grade'=>98.5), 2=>arra ...
- Android 查看联系人电话和姓名(ContentProvider)
1.介绍 2.使用方法 3.在AndroidManifest.xml文件中添加相关设置 <uses-permission android:name="android.permissio ...
- Android系统联系人全特效实现(上),分组导航和挤压动画
记得在我刚接触Android的时候对系统联系人中的特效很感兴趣,它会根据手机中联系人姓氏的首字母进行分组,并在界面的最顶端始终显示一个当前的分组.如下图所示: 最让我感兴趣的是,当后一个分组和前一个分 ...
- android系统联系人分组特效实现(1)---分组导航和挤压动画
1.打开activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/andr ...
- Android:联系人Contacts之ContentResolver query 参数详解
注:本片整理自 http://blog.csdn.net/wssiqi/article/details/8132603 1.获取联系人姓名 一个简单的例子,这个函数获取设备上所有的联系人ID和联系人N ...
- android管理联系人操作
ContentProvider扩展之管理系统联系人 我们都知道ContentProvider是用来共享数据的,然而android本身就提供了大量的ContentProvider,例如联系人信息,系统的 ...
- android系统联系人分组特效实现(2)---字母表快速滚动
要实现这种功能,只需要在 android系统联系人分组特效实现(1)---分组导航和挤压动画 的基础上再加上一个自定义控件即可完成. 1.新建项目,继续新建一个java类,BladeView,用 ...
- Android系统联系人全特效实现(下),字母表快速滚动
在上一篇文章中,我和大家一起实现了类似于Android系统联系人的分组导航和挤压动画功能,不过既然文章名叫做<Android系统联系人全特效实现>,那么没有快速滚动功能显然是称不上&quo ...
随机推荐
- VS中检测数据库链接
在程序中链接数据库,总要为链接语句发愁.可以尝试在链接前,从VS中测试下链接,测试成功的话,可以直接将链接语句复制到程序中. 在VS中,选择“工具”——“连接到数据库”,如下:
- SPSS分类分析:决策树
SPSS分类分析:决策树 一.决策树(分析-分类-决策树) "决策树"过程创建基于树的分类模型.它将个案分为若干组,或根据自变量(预测变量)的值预测因变量(目标变量)的值.此过程为 ...
- 《DSP using MATLAB》Problem 8.38
代码: function [wpLP, wsLP, alpha] = bp2lpfre(wpbp, wsbp) % Band-edge frequency conversion from bandpa ...
- 03-css选择器
<!doctype html><!--声明文档类型 网页文档--> <html><!--根目录标签 父级--> <head><!--网 ...
- T2963 贪吃蛇【BFS,四进制状压,A*】
Online Judge:未知 Label:BFS,四进制状压,暴力,A*,哈希,玄学. 题目描述 给定一个n*m的地图和蛇的初始位置,地图中有些位置有石头,蛇不能经过.当然蛇也不能爬到地图之外. 每 ...
- leetcode-第5周双周赛-1135-最低成本联通所有城市
方法一: class Solution: def minimumCost(self, N: int, conections: List[List[int]]) -> int: def find( ...
- 【JZOJ3337】wyl8899的TLE
description wyl8899今天也很刻苦的在做老师布置下来的题目! 这一天老师布置的题目是这样的: 给出两个仅含小写字母的字符串A和B,输出最大的k,使得A[1..k]是B的子串. A和B的 ...
- Docker配置JDK1.8
1.安装Docker(菜鸟教程有) https://www.runoob.com/docker/centos-docker-install.html 2.docker下载centos镜像(用作配置jd ...
- page方法也是模型的连贯操作方法之一
page方法也是模型的连贯操作方法之一,是完全为分页查询而诞生的一个人性化操作方法. 我们在前面已经了解了关于limit方法用于分页查询的情况,而page方法则是更人性化的进行分页查询的方法,例如还是 ...
- linux top命令VIRT,RES,SHR,DATA的含义(转)
linux top命令VIRT,RES,SHR,DATA的含义 字体: 大 小Posted by 佚名 | tags: top VIRT RES SHR VIRT:virtual memory ...