赢得具有联系人,联系人邮件Uri

好玩的事电话号码获得联系人头像,是常常会遭受的难题。通过ContentProvider,能够访问Android中的联系人等数据。常用的Uri有:

Android系统中的联系人也是透过ContentProvider来对外提供数据的,大家那边达成获取具有联系人、通过电话号码获取联系人、添加联系人、使用工作添加联系人。

关联人音信Uri:content://com.android.contacts/contacts
联系人电话Uri:content://com.android.contacts/data/phones
联络人邮件Uri:content://com.android.contacts/data/emails

得到具有联系人

与此同时提供了依据电话号码获取data表数据的意义,方法为:data/phones/filter/号码,重回三个数量集。再通过数量集得到该联系人的contact_id,根据contact_id打开首像图片的InputStream,最终用BitmapFactory.decodeStream()得到联系人的头像。

  1. Android系统中的联系人也是透过ContentProvider来对外提供数据的
   // 根据号码获得联系人头像
    public static void get_people_image(String x_number){   

        // 获得Uri
        Uri uriNumber2Contacts = Uri.parse("content://com.android.contacts/" 
                + "data/phones/filter/" + x_number); 
        // 查询Uri,返回数据集
        Cursor cursorCantacts = context.getContentResolver().query(
                uriNumber2Contacts, 
                null, 
                null,                        
                null, 
                null);
        // 如果该联系人存在
        if (cursorCantacts.getCount() > 0) { 
            // 移动到第一条数据
                  cursorCantacts.moveToFirst();
                  // 获得该联系人的contact_id
                  Long contactID = cursorCantacts.getLong(cursorCantacts  
                        .getColumnIndex("contact_id"));
                  // 获得contact_id的Uri
                  Uri uri = ContentUris.withAppendedId(  
                        ContactsContract.Contacts.CONTENT_URI, contactID);
                  // 打开头像图片的InputStream
                  InputStream input = ContactsContract.Contacts  
                        .openContactPhotoInputStream(context.getContentResolver(), uri); 
                  // 从InputStream获得bitmap
                  bmp_head = BitmapFactory.decodeStream(input);       
    }
}

贰.
数据库路径为:/data/data/com.android.providers.contacts/database/contacts二.db

  

  1. 作者们必要关注的有三张表

raw_contacts:在那之中保存了联络人id

data:和raw_contacts是多对1的涉及,保存了牵连人的种种数据

mimetypes:为数据类型

  1. Provider的authorites为com.android.contacts

  2. 查询raw_contacts表的门道为:contacts

  3. 查询data表的路子为:contacts/#/data

这一个途径为一而再查询,要询问“mimetype”字段能够根据“mimetype_id”查询到mimetypes表中的数据

7.
先查询raw_contacts获得每一个联系人的id,在选取id从data表中询问相应数据,依据mimetype分类数据

示例:

 

         //查询全体联系人  

    public void testGetAll() {  

    ContentResolver resolver = getContext().getContentResolver();  

    Uri uri = Uri.parse(“content://com.android.contacts/contacts”);  

    Cursor idCursor = resolver.query(uri, new String[] { “_id” },
null, null, null);  

    while (idCursor.moveToNext()) {  

        //获取到raw_contacts表中的id  

        int id = idCursor.getInt(0);   

        //依照取获得的ID查询data表中的数据  

       uri = Uri.parse(“content://com.android.contacts/contacts/” + id +
“/data”);  

        Cursor dataCursor = resolver.query(uri, new String[] {
“data1”, “mimetype” }, null, null, null);  

        StringBuilder sb = new StringBuilder();  

        sb.append(“id=” + id);  

        //查询联系人表中的  

        while (dataCursor.moveToNext()) {  

            String data = dataCursor.getString(0);  

            String type = dataCursor.getString(1);  

          if (“vnd.android.cursor.item/name”.equals(type))  

                sb.append(“, name=” + data);  

           else if (“vnd.android.cursor.item/phone_v2”.equals(type))  

               sb.append(“, phone=” + data);  

            else if (“vnd.android.cursor.item/email_v2”.equals(type))  

                sb.append(“, email=” + data);  

        }  

        System.out.println(sb);  

    }  

 

经过电话号码获取联系人

①.
系统里头提供了依照电话号码获取data表数据的意义,路径为:data/phones/filter/*

贰.
用电话号码替换“*”部分就足以查到所需数据,获取“display_name”能够赢获得联系人展现名

示例:

        //根据电话号码查询联系人名称  

  public void testGetName() {  

    ContentResolver resolver = getContext().getContentResolver();  

    Uri uri =
Uri.parse(“content://com.android.contacts/data/phones/filter/1111”);  

    Cursor c = resolver.query(uri, new String[] { “display_name” },
null, null, null);  

    while (c.moveToNext()) {  

        System.out.println(c.getString(0));  

    }  

拉长交流人

  1. 先向raw_contacts表插入id,路径为:raw_contacts

  2. 取得id之后再向data表插入数据,路径为:data

示例:

       //添加联系人  

  ublic void testInsert() {  

 ContentResolver resolver = getContext().getContentResolver();  

Uri uri = Uri.parse(“content://com.android.contacts/raw_contacts”);  

ContentValues values = new ContentValues();  

// 向raw_contacts插入一条除了ID之外, 别的1切为NULL的记录,
ID是自动生成的  

long id = ContentUris.parseId(resolver.insert(uri, values));   

//添加挂钩人姓名  

uri = Uri.parse(“content://com.android.contacts/data”);  

values.put(“raw_contact_id”, id);  

values.put(“data2”, “FHM”);  

values.put(“mimetype”, “vnd.android.cursor.item/name”);  

resolver.insert(uri, values);  

                //添加联系人电话  

values.clear(); // 清空上次的数目  

values.put(“raw_contact_id”, id);  

values.put(“data1”, “18600000000”);  

values.put(“data2”, “2”);  

values.put(“mimetype”, “vnd.android.cursor.item/phone_v2”);  

resolver.insert(uri, values);  

//添加挂钩人邮箱  

values.clear();  

values.put(“raw_contact_id”, id);  

values.put(“data1”, “zxx@itcast.cn”);  

values.put(“data2”, “1”);  

values.put(“mimetype”, “vnd.android.cursor.item/email_v2”);  

resolver.insert(uri, values);  

 

选拔工作添加联系人

1.
在加上维系人得时候是分数次走访Provider,假若在经过中出现至极,会并发数量不完整的动静,那一个操作应该放在2回事情中

  1. 行使ContentResolver的applyBatch(String
    authority,ArrayList<ContentProviderOperation> operations)
    方法能够将四个操作在1个事情中执行

示例:

        //使用工作添加联系人  

public void testInsertBatch() throws Exception {  

    ContentResolver resolver = getContext().getContentResolver();  

 

    ArrayList<ContentProviderOperation> operations = new
ArrayList<ContentProviderOperation>();  

 

    ContentProviderOperation operation1 = ContentProviderOperation //  

           
.newInsert(Uri.parse(“content://com.android.contacts/raw_contacts”))
//  

            .withValue(“_id”, null) //  

            .build();  

    operations.add(operation1);  

 

    ContentProviderOperation operation2 = ContentProviderOperation //  

            .newInsert(Uri.parse(“content://com.android.contacts/data”))
//  

            .withValueBackReference(“raw_contact_id”, 0) //  

            .withValue(“data2”, “ZZH”) //  

            .withValue(“mimetype”, “vnd.android.cursor.item/name”) //  

            .build();  

    operations.add(operation2);  

      

    ContentProviderOperation operation3 = ContentProviderOperation //  

            .newInsert(Uri.parse(“content://com.android.contacts/data”))
//  

            .withValueBackReference(“raw_contact_id”, 0) //  

            .withValue(“data1”, “18612312312”) //  

            .withValue(“data2”, “2”) //  

            .withValue(“mimetype”, “vnd.android.cursor.item/phone_v2”)
//  

            .build();  

    operations.add(operation3);  

 

    ContentProviderOperation operation4 = ContentProviderOperation //  

            .newInsert(Uri.parse(“content://com.android.contacts/data”))
//  

            .withValueBackReference(“raw_contact_id”, 0) //  

            .withValue(“data1”, “www.2cto.com”) //  

            .withValue(“data2”, “2”) //  

            .withValue(“mimetype”, “vnd.android.cursor.item/email_v2”)
//  

            .build();  

    operations.add(operation4);  

 

    // 在工作中对多个操作批量实施  

    resolver.applyBatch(“com.android.contacts”, operations);  

 

相关文章