您的位置:首页 > 移动开发 > Android开发

android根据姓名首字母字符顺序读取通信录

2015-08-03 17:59 597 查看
本文给出了Android读取通讯录联系人的一般方法,且在读取Android通讯录联系人时候,将结果有序化(按照联系人姓名的首字符依次顺序读取:A ~ Z)。

读取的结果如图所示:



现给出实现该种Android通讯录读取的代码:

[java] view
plaincopy

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读写通讯录联系人的权限:

[html] view
plaincopy

<!-- 写权限 -->

<uses-permission android:name="android.permission.WRITE_CONTACTS" />

<!-- 读权限 -->

<uses-permission android:name="android.permission.READ_CONTACTS" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: