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