根据联系人姓名首字符顺序读取通讯录

package com.zzw.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);
        // setContentView(R.layout.activity_main);

        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;
        private ArrayList<Contact> contacts;

        public MyAdapter(Context context, int resource, ArrayList<Contact> contacts) {
            super(context, resource, contacts);
            this.resource = resource;
            this.contacts = contacts;
            inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        @Override
        public int getCount() {
            return contacts.size();
        }

        @Override
        public Contact getItem(int position) {
            return contacts.get(position);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            if (convertView == null) {
                convertView = inflater.inflate(resource, null);
            }

            Contact contact = getItem(position);

            TextView text1 = (TextView) convertView.findViewById(android.R.id.text1);
            TextView text2 = (TextView) convertView.findViewById(android.R.id.text2);

            // 首字符,分组的依据
            text1.setText(contact.firstLetterOfName());

            // 详情
            text2.setText(contact.name + "" + contact.getPhoneNumbers());
            return convertView;
        }

    }

    // 读取设备联系人的一般方法。大致流程就是这样,模板化的操作代码。
    private void readContacts(ArrayList<Contact> contacts) {
        Uri uri = Uri.parse("content://com.android.contacts/contacts");
        ContentResolver resolver = this.getContentResolver();

        // 在这里我们给query传递进去一个SORT_KEY_PRIMARY
        // 告诉ContentResolver获得的结果按照联系人名字的首字母有序排序
        Cursor cursor = resolver.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 sork_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.sort_key_primay = sork_key_primary;
            mContact.name = name;

            // 获取联系人的手机号码
            Cursor phone = resolver.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_primay;
        public ArrayList<String> phoneNumbers;

        // 获得一个联系人名字的首字母。
        // 比如一个人的名字叫做“安卓”,那么这个人的首字母是:A
        public String firstLetterOfName() {
            String s = sort_key_primay.charAt(0) + "";

            return s.toUpperCase();
        }

        public String getPhoneNumbers() {
            String phones = "";
            for (int i = 0; i < phoneNumbers.size(); i++) {
                phones += ":     " + phoneNumbers.get(i);
            }
            return phones;
        }
    }
}

权限:

1 <!-- 写权限 -->
2     <uses-permission android:name="android.permission.WRITE_CONTACTS" />
3     <!-- 读权限 -->
4     <uses-permission android:name="android.permission.READ_CONTACTS" />

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值