使用Provider与Resolver读取系统联系人并插入联系人

来源:互联网 发布:ubuntu 14.04 配置ip 编辑:程序博客网 时间:2024/05/19 03:41
读取系统联系人

1.系统联系人源码

  类
  packages/providers/ContactsProvider2
  
  首先看清单 --- authority
   <provider android:name="ContactsProvider2"
            android:authorities="contacts;com.android.contacts"

  权限
   android:readPermission="android.permission.READ_CONTACTS"
            android:writePermission="android.permission.WRITE_CONTACTS">

  再看类 --- 获取Uri
   UriMatcher

   matcher.addURI(ContactsContract.AUTHORITY, "raw_contacts", RAW_CONTACTS);
   matcher.addURI(ContactsContract.AUTHORITY, "raw_contacts/#/data", RAW_CONTACTS_DATA);



2.数据库的位置
  /data/data/com.android.providers.contacts/databases/contacts2.db


3.重要的表

  contacts
  raw_contacts
  data
  mimetypes
  一般看后三张表

  详细:
  data中存放联系人的 姓名、手机号、邮箱、地址等。

  mimetypes中存放data对应字段mimetype的信息。 
  如:mimetype_id 5对应联系人电话

  raw_contacts中存放data对应字段raw_contact_id,_id表示每一个练习人的id

  data表中字段与对应的表
  mimetype               mimetypes
  raw_contact_id         raw_contacts   


4.查询步骤
  1) 查询raw_contacts表
     获取_id --- 每一个_id代表一个联系人
     uri --- content://com.android.contacts/raw_contacts

  2) 查询data
     uri --- content://com.android.contacts/raw_contacts/_id/data

     遍历每一个_id(while循环),raw_contacts表中_id对应data表中的raw_contact_id。
     即查询data表中的每一个raw_contact_id,查询出字段为data1, mimetype 字段,
     判断mimetype,并将相应数据封装到bean中。

     注意:其实查询了两张表:mimetypes与data,因为如果输出字段名,可以看到mimetype而非mimetype_id


5.插入步骤
  1)向 raw_contacts表中插入_id
    uri --- content://com.android.contacts/raw_contacts


  2)向 data表中插入数据
    uri --- content://com.android.contacts/data

public class MainActivity extends Activity {private ContentResolver resolver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}/** * 查询所有联系人 *  * @param v */public void query(View v) {resolver = getContentResolver();// 联系人集合List<ContactInfo> infos = new ArrayList<ContactInfo>();// 查询raw_contants表中_id字段,每个_id对应一个联系人Cursor cursor = resolver.query(Uri.parse("content://com.android.contacts/raw_contacts"),new String[] { "_id" }, null, null, null);while (cursor.moveToNext()) {// 联系人ContactInfo info = new ContactInfo();int _id = cursor.getInt(cursor.getColumnIndex("_id"));info._id = _id;// 根据_id查询data表中的data1和mimetype字段的值Cursor c = resolver.query(Uri.parse("content://com.android.contacts/raw_contacts/"+ _id + "/data"), null, null, null, null);while (c.moveToNext()) {// 其实查询了两张表:mimetypes与data,因为如果输出字段名,可以看到mimetype// 而非mimetype_idString data = c.getString(c.getColumnIndex("data1"));String mimetype = c.getString(c.getColumnIndex("mimetype"));if ("vnd.android.cursor.item/name".equals(mimetype)) {// 联系人姓名info.name = data;} else if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) {// 联系人手机号info.phone = data;} else if ("vnd.android.cursor.item/email_v2".equals(mimetype)) {// 联系人邮箱info.email = data;}}// 将联系人添加到集合infos.add(info);c.close();}cursor.close();for (ContactInfo contactInfo : infos) {System.out.println(contactInfo);}}/** * 插入联系人 *  * @param v */public void insert(View v) {resolver = getContentResolver();// 向raw_contacts表中插入_idContentValues values = new ContentValues();Uri uri = resolver.insert(Uri.parse("content://com.android.contacts/raw_contacts"),values);// 通过uri获取_idlong _id = ContentUris.parseId(uri);// 向data表中插入数据// 插入姓名values.clear();values.put("raw_contact_id", _id);values.put("data1", "xixi");values.put("mimetype", "vnd.android.cursor.item/name");resolver.insert(Uri.parse("content://com.android.contacts/data"),values);// 插入手机号values.clear();values.put("raw_contact_id", _id);values.put("data1", "123456");values.put("mimetype", "vnd.android.cursor.item/phone_v2");resolver.insert(Uri.parse("content://com.android.contacts/data"),values);// 插入邮箱values.clear();values.put("raw_contact_id", _id);values.put("data1", "123456@qq.com");values.put("mimetype", "vnd.android.cursor.item/email_v2");resolver.insert(Uri.parse("content://com.android.contacts/data"),values);}}


0 0
原创粉丝点击