添加联系人至通讯录

Android中通讯录使用ContentProvider实现

Android中通讯录界面是使用一个App


存储内容使用的是另一个App


需要的权限:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <uses-permission android:name="android.permission.READ_CONTACTS"/><!-- 读取通讯录权限 -->  
  2. <uses-permission android:name="android.permission.WRITE_CONTACTS"/><!-- 写入通讯录权限 -->  

还有junit单元测试的权限等配置,这里不写了。

单元测试类:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.example.test;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.content.ContentProviderOperation;  
  6. import android.content.ContentResolver;  
  7. import android.content.ContentUris;  
  8. import android.content.ContentValues;  
  9. import android.database.Cursor;  
  10. import android.net.Uri;  
  11. import android.test.AndroidTestCase;  
  12. import android.util.Log;  
  13.   
  14. public class ContactsTest extends AndroidTestCase {  
  15.     private static final String TAG = "ContactsTest";  
  16.   
  17.     /** 
  18.      * 获取联系人 
  19.      * */  
  20.     public void testGetContacts(){  
  21.         Uri uri = Uri.parse("content://com.android.contacts/contacts"); // 访问所有联系人  
  22.         ContentResolver resolver = getContext().getContentResolver();  
  23.         Cursor cursor = resolver.query(uri, new String[]{"_id"}, nullnullnull);  
  24.         while(cursor.moveToNext()){  
  25.             int contactsId = cursor.getInt(0);  
  26.             StringBuilder sb = new StringBuilder("contactsId=");  
  27.             sb.append(contactsId);  
  28.             uri = Uri.parse("content://com.android.contacts/contacts/" + contactsId + "/data"); //某个联系人下面的所有数据  
  29.             Cursor dataCursor = resolver.query(uri, new String[]{"mimetype""data1""data2"}, nullnullnull);  
  30.             while(dataCursor.moveToNext()){  
  31.                 String data = dataCursor.getString(dataCursor.getColumnIndex("data1"));  
  32.                 String type = dataCursor.getString(dataCursor.getColumnIndex("mimetype"));  
  33.                 if("vnd.android.cursor.item/name".equals(type)){    // 如果他的mimetype类型是name  
  34.                     sb.append(", name=" + data);  
  35.                 } else if("vnd.android.cursor.item/email_v2".equals(type)){ // 如果他的mimetype类型是email  
  36.                     sb.append(", email=" + data);  
  37.                 } else if("vnd.android.cursor.item/phone_v2".equals(type)){ // 如果他的mimetype类型是phone  
  38.                     sb.append(", phone=" + data);  
  39.                 }   
  40.             }  
  41.             Log.i(TAG, sb.toString());  
  42.         }  
  43.     }  
  44.       
  45.     /** 
  46.      * 根据来电号码获取联系人名字 
  47.      * */  
  48.     public void testGetContactsByNumber(){  
  49.         String number = "15292328801";  
  50.         Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/" + number);  
  51.         ContentResolver resolver = getContext().getContentResolver();  
  52.         Cursor cursor = resolver.query(uri, new String[]{"display_name"}, nullnullnull);  
  53.         if(cursor.moveToFirst()){  
  54.             String name = cursor.getString(0);  
  55.             Log.i(TAG, name);  
  56.         }  
  57.     }  
  58.       
  59.     /** 
  60.      * 添加联系人 
  61.      * 数据一个表一个表的添加,每次都调用insert方法 
  62.      * */  
  63.     public void testAddContacts(){  
  64.         /* 往 raw_contacts 中添加数据,并获取添加的id号*/  
  65.         Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");  
  66.         ContentResolver resolver = getContext().getContentResolver();  
  67.         ContentValues values = new ContentValues();  
  68.         long contactId = ContentUris.parseId(resolver.insert(uri, values));  
  69.           
  70.         /* 往 data 中添加数据(要根据前面获取的id号) */  
  71.         // 添加姓名  
  72.         uri = Uri.parse("content://com.android.contacts/data");  
  73.         values.put("raw_contact_id", contactId);  
  74.         values.put("mimetype""vnd.android.cursor.item/name");  
  75.         values.put("data2""周国平");  
  76.         resolver.insert(uri, values);  
  77.           
  78.         // 添加电话  
  79.         values.clear();  
  80.         values.put("raw_contact_id", contactId);  
  81.         values.put("mimetype""vnd.android.cursor.item/phone_v2");  
  82.         values.put("data2""2");  
  83.         values.put("data1""15099144117");  
  84.         resolver.insert(uri, values);  
  85.           
  86.         // 添加Email  
  87.         values.clear();  
  88.         values.put("raw_contact_id", contactId);  
  89.         values.put("mimetype""vnd.android.cursor.item/email_v2");  
  90.         values.put("data2""2");  
  91.         values.put("data1""zhouguoping@qq.com");  
  92.         resolver.insert(uri, values);  
  93.     }  
  94.       
  95.     /** 
  96.      * 添加联系人 
  97.      * 在同一个事务中完成联系人各项数据的添加 
  98.      * 使用ArrayList<ContentProviderOperation>,把每步操作放在它的对象中执行 
  99.      * */  
  100.     public void testAddContacts2(){  
  101.         Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");  
  102.         ContentResolver resolver = getContext().getContentResolver();  
  103.         // 第一个参数:内容提供者的主机名  
  104.         // 第二个参数:要执行的操作  
  105.         ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();  
  106.           
  107.         // 操作1.添加Google账号,这里值为null,表示不添加  
  108.         ContentProviderOperation operation = ContentProviderOperation.newInsert(uri)  
  109.                 .withValue("account_name"null)// account_name:Google账号  
  110.                 .build();  
  111.           
  112.         // 操作2.添加data表中name字段  
  113.         uri = Uri.parse("content://com.android.contacts/data");  
  114.         ContentProviderOperation operation2 = ContentProviderOperation.newInsert(uri)  
  115.                 // 第二个参数int previousResult:表示上一个操作的位于operations的第0个索引,  
  116.                 // 所以能够将上一个操作返回的raw_contact_id作为该方法的参数  
  117.                 .withValueBackReference("raw_contact_id"0)  
  118.                 .withValue("mimetype""vnd.android.cursor.item/name")  
  119.                 .withValue("data2""周国平")  
  120.                 .build();  
  121.           
  122.         // 操作3.添加data表中phone字段  
  123.         uri = Uri.parse("content://com.android.contacts/data");  
  124.         ContentProviderOperation operation3 = ContentProviderOperation.newInsert(uri)  
  125.                 .withValueBackReference("raw_contact_id"0)  
  126.                 .withValue("mimetype""vnd.android.cursor.item/phone_v2")  
  127.                 .withValue("data2""2")  
  128.                 .withValue("data1""15099144117")  
  129.                 .build();  
  130.           
  131.         // 操作4.添加data表中的Email字段  
  132.         uri = Uri.parse("content://com.android.contacts/data");  
  133.         ContentProviderOperation operation4 = ContentProviderOperation  
  134.                 .newInsert(uri).withValueBackReference("raw_contact_id"0)  
  135.                 .withValue("mimetype""vnd.android.cursor.item/email_v2")  
  136.                 .withValue("data2""2")  
  137.                 .withValue("data1""zhouguoping@qq.com").build();  
  138.           
  139.         operations.add(operation);  
  140.         operations.add(operation2);  
  141.         operations.add(operation3);  
  142.         operations.add(operation4);  
  143.           
  144.         try {  
  145.             resolver.applyBatch("com.android.contacts", operations);  
  146.         } catch (Exception e) {  
  147.             e.printStackTrace();  
  148.         }   
  149.     }  
  150. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值