在模拟器中添加几个联系人,在data/data/下导出数据库,如下:
打开。
关心的表有:raw_contact,data,mimetypes,计三张表。
首先得到内容解析器,得到内容解析器之后,既可以使用查询的方法了,查询需要传入URI,查看源代码看下raw_contacts的路径。
resolver.query(uri, new String[]{"contact_id"}, selection, selectionArgs, sortOrder);
query的第二个参数对应于raw_contacts这张表,我们只关心联系人的id:
其他参数全部传入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; } }
运行得到下面的结果:
时间: 2024-10-07 08:25:32