Android(java)学习笔记193:ContentProvider使用之获得系统联系人信息01
1.系统联系人的数据库(3张最重要的表)
(1)raw_contacts 联系人表
保存联系人的id contact_id
(2)data 数据表
保存联系人的数据
(3)mimetypes
MIME数据类型表
2.因为如果要访问ContentProvider,必须要了解URI的设置(authority,path等);只有查看源代码才能够知道;AndroidManifest.xml为清单文件,列出了ContactProvider的authorities,以及要访问通讯录需要的权限;
3.通讯录数据库结构介绍:
表结构如下:
通讯录是存放在/data/data/com.android.providers.contacts/databases/contacts2.db,里面主要的表有:
(1)raw_contacts:存放联系人的ID,
_id属性为主键,声明为autoincrement,即不需要手动设置,其他属性也不需要手动设置就有默认值;
display_name属性为姓名;
(2)mimetypes:存放数据的类型,比如"vnd.android.cursor.item/name"表示“姓名”类型的数据,"vnd.android.cursor.item/phone_v2"表示“电话”类型的数据;
(3)data:存放具体的数据;
raw_contact_id属性用来连接raw_contacts表,每条记录表示一个具体数据;我们主要的数据(email、phone等)都存放在data表;
data1属性存放总数据;
data2属性:
-如果此记录存放姓名,则data2存放名;
-如果此记录存放电话,则data2存放类型,比如手机、家电;
-如果此记录存放组织,则data2存放类型,比如公司、其他;
-如果此记录存放地址,则data2存放类型,比如住宅,单位等;
4. 编程提示:
URI
对raw_contacts表添加、删除、更新操作:
URI = content://com.android.contacts/raw_contacts;
URI = content://com.android.contacts/data/emails/filter/*
根据电话号码对data表查询
URI = content://com.android.contacts/data/phone/filter/*
Data中的常量
Data._ID: "_id"
Data.DISPLAY_NAME:“display_name”
Data.DATA1:“data1”
Data.DATA2:“data2”
Data.RAW_CONTACT_ID:“raw_contact_id”
Data.MIMETYPE:“mimetype”
5.思考? 如何获取联系人的数据。
(1) 查询raw_contacts 获取所有的联系人的id ;
(2) 根据id查询data表,获取当前联系人的数据 ;
6.下面通过一个案例说明如何获取联系人信息
(1)activity_main.xml文件,如下:
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:paddingBottom="@dimen/activity_vertical_margin" 6 android:paddingLeft="@dimen/activity_horizontal_margin" 7 android:paddingRight="@dimen/activity_horizontal_margin" 8 android:paddingTop="@dimen/activity_vertical_margin" 9 tools:context="com.himi.readcontacts.MainActivity" > 10 11 <Button 12 android:onClick="click" 13 android:layout_width="wrap_content" 14 android:layout_height="wrap_content" 15 android:layout_centerHorizontal="true" 16 android:layout_centerVertical="true" 17 android:text="读取联系人数据" /> 18 19 </RelativeLayout>
布局效果,如下:
(2)MainActivity.java,如下:
1 package com.himi.readcontacts; 2 3 import android.app.Activity; 4 import android.content.ContentResolver; 5 import android.database.Cursor; 6 import android.net.Uri; 7 import android.os.Bundle; 8 import android.view.View; 9 10 public class MainActivity extends Activity { 11 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.activity_main); 16 } 17 18 /** 19 * 20 * 读取联系人数据库,获取联系人信息 21 */ 22 public void click(View view) { 23 ContentResolver resolver = getContentResolver(); 24 Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); 25 Uri datauri = Uri.parse("content://com.android.contacts/data"); 26 //1.查询raw_contacts表格,获取用户id 27 Cursor cursor = resolver.query(uri, new String[]{"contact_id"}, null, null, null); 28 while(cursor.moveToNext()) { 29 String id =cursor.getString(0); 30 System.out.println(id); 31 //2.根据id查询data表,把这个联系人的数据获取出来 32 Cursor dataCursor = resolver.query(datauri, new String[]{"data1","mimetype"}, "raw_contact_id=?", 33 new String[]{id}, null); 34 while(dataCursor.moveToNext()) { 35 String data1 = dataCursor.getString(0); 36 String mimetype = dataCursor.getString(1); 37 System.out.println("data:"+data1); 38 System.out.println("mimetype:"+mimetype); 39 } 40 dataCursor.close(); 41 42 } 43 cursor.close(); 44 } 45 46 }
当然上面观察源码,可以获取访问的权限,如下:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
添加到AndroidMainfest.xml文件之中。
(3)布署到模拟器上,运行如下:
点击" 读取联系人数据",观察logcat打印的日志:
09-15 00:49:13.538: I/System.out(744): id1
09-15 01:17:25.688: I/System.out(841): 1
09-15 01:17:26.018: I/System.out(841): data:221112@163.com
09-15 01:17:26.018: I/System.out(841): mimetype:vnd.android.cursor.item/email_v2
09-15 01:17:26.018: I/System.out(841): data:34555555555
09-15 01:17:26.028: I/System.out(841): mimetype:vnd.android.cursor.item/phone_v2
09-15 01:17:26.028: I/System.out(841): data:Yjg
09-15 01:17:26.028: I/System.out(841): mimetype:vnd.android.cursor.item/name
09-15 01:17:26.048: I/System.out(841): 2
09-15 01:17:26.108: I/System.out(841): data:22222222@163.com
09-15 01:17:26.108: I/System.out(841): mimetype:vnd.android.cursor.item/email_v2
09-15 01:17:26.108: I/System.out(841): data:355-5555
09-15 01:17:26.108: I/System.out(841): mimetype:vnd.android.cursor.item/phone_v2
09-15 01:17:26.118: I/System.out(841): data:Yty
09-15 01:17:26.118: I/System.out(841): mimetype:vnd.android.cursor.item/name
打印的日志表明,已经获取了联系人的信息,下面是通信录中保存的联系人,如下: