在模拟器中添加几个联系人,在data/data/下导出数据库,如下:
打开。
关心的表有:raw_contact,data,mimetypes,计三张表。
首先得到内容解析器,得到内容解析器之后,既可以使用查询的方法了,查询需要传入URI,查看源代码看下raw_contacts的路径。
resolver.query(uri, new String[]{"contact_id"}, selection, selectionArgs, sortOrder);
其他参数全部传入null。查询的结果返回的为cursor,对cursor进行moveToNext循环得到contact_id:
String contact_id = cursor.getString(0);根据得到的contact_id,查询对应data表中的数据。
Cursor dataCursor = resolver.query(uriData, new String[]{"data1"}, "contact_id=?", new String[]{contact_id}, null);将最后的数据存入MAP中,将map添加到list中,返回list。
主界面的布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}" >
<ListView
android:id="@+id/contact"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:cacheColorHint="#00000000"
android:descendantFocusability="afterDescendants"
android:divider="#cccccc"
android:dividerHeight="1px"
android:fastScrollEnabled="false" />
</RelativeLayout>每个listitem的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/iv_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/default_avatar"
/>
<TextView
android:layout_toRightOf="@id/iv_image"
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="name"
android:textSize="18sp"
android:layout_marginLeft="10dp"
android:textColor="#88000000"
/>
<TextView
android:textColor="#88000000"
android:textSize="18sp"
android:id="@+id/phone"
android:layout_toRightOf="@id/iv_image"
android:layout_below="@id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="15205553932"
android:layout_marginLeft="10dp"
/>
</RelativeLayout>
逻辑代码:
package com.dy.ustc.readcontact;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
public class MainActivity extends Activity {
private ListView contact;
private ImageView iv_image;
private TextView name;
private TextView phone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contact = (ListView) findViewById(R.id.contact);
List<Map<String, String>> data = getContactInfo();
contact.setAdapter(new SimpleAdapter(this, data, R.layout.list_item, new String[]{"name","phone"},
new int[]{R.id.name,R.id.phone}));
}
/**
*
* 读取手机的联系人信息
*
* @return
*/
private List<Map<String, String>> getContactInfo() {
//把所有的联系人
List<Map<String, String>> list = new ArrayList<Map<String,String>>();
// 得到一个内容解析器
ContentResolver resolver = getContentResolver();
// raw_contacts这张表的路径
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
// data表的路径
Uri uriData = Uri.parse("content://com.android.contacts/data");
Uri uri_mimetype = Uri.parse("content://com.android.contacts/mimetype");
Cursor cursor = resolver.query(uri, new String[] { "contact_id" },
null, null, null);
while (cursor.moveToNext()) {
String contact_id = cursor.getString(0);
if (contact_id != null) {
//具体的某一个联系人
Map<String, String> map = new HashMap<String, String>();
Cursor dataCursor = resolver.query(uriData,
new String[] { "data1","mimetype" }, "contact_id=?",
new String[] { contact_id }, null);
while (dataCursor.moveToNext()) {
String data1 = dataCursor.getString(0);
//System.out.println(data1);
String mimetype = dataCursor.getString(1);
System.out.println(mimetype + ":" + data1);
if ("vnd.android.cursor.item/name".equals(mimetype)) {
//联系人的姓名
map.put("name", data1);
}else if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) {
//联系人的电话号码
map.put("phone", data1);
}
}
list.add(map);
dataCursor.close();
}
}
cursor.close();
return list;
}
}
原文:http://blog.csdn.net/chenfuduo_loveit/article/details/41807425