Android(java)学习笔记194:ContentProvider使用之获得系统联系人信息02(掌握)

1.重要:

系统删除一个联系人,默认情况下并不是把这个联系人直接删除掉了,只是做了一个标记,标记为被删除。

2.前面一讲说过了如何获取系统联系人信息(通过ContentProvider),获取联系人信息是经常使用,下面封装成工具类,方便以后调用:

下面通过案例说明一下:

(1)Android工程如下图:

 

(2)其中工具类ContactInfoUtils.java,如下:

  1 package com.himi.readcontacts.utils;
  2 
  3 import java.util.ArrayList;
  4 import java.util.List;
  5 
  6 import android.content.ContentResolver;
  7 import android.content.ContentValues;
  8 import android.content.Context;
  9 import android.database.Cursor;
 10 import android.net.Uri;
 11 import android.provider.ContactsContract.Data;
 12 
 13 import com.himi.readcontacts.domain.ContactInfo;
 14 
 15 /**
 16  * 联系人信息的工具类
 17  * @author Administrator
 18  *
 19  */
 20 public class ContactsInfoUtils {
 21     
 22     /**
 23      * 根据电话号码查询姓名
 24      * @param context 上下文
 25      * @return 返回
 26      */
 27     public static String getContactByPhone(Context context,String phone)throws Exception{  
 28         //uri=  content://com.android.contacts/data/phones/filter/#  
 29         Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/"+phone);      
 30         ContentResolver resolver = context.getContentResolver();  
 31         Cursor cursor = resolver.query(uri, new String[]{Data.DISPLAY_NAME}, null, null, null); //从raw_contact表中返回display_name  
 32         if(cursor.moveToFirst()){  
 33             System.out.println("name="+cursor.getString(0));  
 34         }
 35         String result = cursor.getString(0);
 36         return result;
 37     }  
 38     
 39     
 40 
 41     /**
 42      * 查询所有联系人信息
 43      * @param context 上下文
 44      * @return
 45      */
 46     public static List<ContactInfo> getAllContactInfos(Context context)  {
 47         List<ContactInfo> infos = new ArrayList<ContactInfo>();
 48         ContentResolver resolver = context.getContentResolver();
 49         Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
 50         Uri datauri = Uri.parse("content://com.android.contacts/data");
 51         Cursor cursor = resolver.query(uri, new String[] { "contact_id" },
 52                 null, null, null);
 53         while (cursor.moveToNext()) {
 54             String id = cursor.getString(0);
 55             ContactInfo info = new ContactInfo();
 56             info.setId(id);
 57 
 58             System.out.println("id"+id);
 59             if (id != null) {
 60                 // 根据id查询data表,把这个联系人的数据获取出来
 61                 Cursor dataCursor = resolver.query(datauri, new String[] {
 62                         "data1", "mimetype" }, "raw_contact_id=?",
 63                         new String[] { id }, null);
 64                 while (dataCursor.moveToNext()) {
 65                     String data1 = dataCursor.getString(0);
 66                     String mimetype = dataCursor.getString(1);
 67                     if (data1 != null && mimetype != null) {
 68                         if ("vnd.android.cursor.item/email_v2".equals(mimetype)) {// email
 69                             info.setEmail(data1);
 70                         } else if ("vnd.android.cursor.item/im"
 71                                 .equals(mimetype)) {// QQ
 72                             info.setQQ(data1);
 73                         } else if ("vnd.android.cursor.item/name"
 74                                 .equals(mimetype)) {// name
 75                             info.setName(data1);
 76                         } else if ("vnd.android.cursor.item/phone_v2"
 77                                 .equals(mimetype)) {// phone
 78                             info.setPhone(data1);
 79                         }
 80                     }
 81                 }
 82                 infos.add(info);
 83                 dataCursor.close();
 84             }
 85         }
 86         cursor.close();
 87         return infos;
 88     }
 89     
 90     /**
 91      * 添加一个联系人
 92      * @param context  上下文
 93      * @param phone 添加联系人的电话  
 94      * @param name  添加联系人的姓名  
 95      * @param email 添加联系人的email  
 96      */
 97     public static  void AddContact(Context context, String phone, String name, String email)throws Exception {
 98         Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
 99         Uri datauri = Uri.parse("content://com.android.contacts/data");
100         ContentResolver resolver = context.getContentResolver();
101         //1.在raw_contace表里面添加一条新的id        _id desc:表示按照id降序排列
102         Cursor cursor = resolver.query(uri, new String[]{"_id"}, null, null, "_id desc");
103         cursor.moveToFirst();
104         int _id = cursor.getInt(0);//之前,降序排列,这里获得表中最大id值
105         //计算出来新添加的条目的id
106         int newId = _id+1;
107         ContentValues values = new ContentValues();
108         values.put("contact_id", newId);
109         resolver.insert(uri, values);
110         
111         //2.在data表中添加对应的数据
112         //添加电话号码phone
113         ContentValues phoneValue = new ContentValues();
114         phoneValue.put("raw_contact_id", newId);
115         phoneValue.put("mimetype", "vnd.android.cursor.item/phone_v2");
116         phoneValue.put("data1", phone);
117         resolver.insert(datauri, phoneValue);
118         //添加姓名
119         ContentValues nameValue = new ContentValues();
120         nameValue.put("raw_contact_id", newId);
121         nameValue.put("mimetype", "vnd.android.cursor.item/name");
122         nameValue.put("data1", name);
123         resolver.insert(datauri, nameValue);
124         //添加email
125         ContentValues emailValue = new ContentValues();
126         emailValue.put("raw_contact_id", newId);
127         emailValue.put("mimetype", "vnd.android.cursor.item/email_v2");
128         emailValue.put("data1", email);
129         resolver.insert(datauri, emailValue);
130         
131     }
132     
133     /**
134      * 删除一个联系人
135      * 
136      * 核心思想:
137      *      (1)先在raw_contacts表根据姓名(此处的姓名为name记录的data2的数据而不是data1的数据)查出id;
138      *      (2)在data表中只要raw_contact_id匹配的都删除;
139      * @param context  上下文
140      * @param name   删除用户的姓名
141      */
142     public static boolean DeleteContact(Context context,String name)throws Exception{ 
143         boolean status = false;
144         //根据姓名求id  
145         Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");  
146         ContentResolver resolver = context.getContentResolver();  
147         Cursor cursor = resolver.query(uri, new String[]{Data._ID},"display_name=?", new String[]{name}, null);  
148         if(cursor.moveToFirst()){  
149             int id = cursor.getInt(0);  
150             //根据id删除data中的相应数据  
151             resolver.delete(uri, "display_name=?", new String[]{name});  
152             uri = Uri.parse("content://com.android.contacts/data"); 
153             //根据id清空raw_contact_id
154             resolver.delete(uri, "raw_contact_id=?", new String[]{id+""}); 
155             status = true;
156         }
157       return status; 
158     } 
159     
160     /**
161      * 更新联系人
162      * 核心思想:
163      *      (1)不需要更新raw_contacts,只需要更新data表;
164      *      (2)uri=content://com.android.contacts/data 表示对data表进行操作;
165      * @param context
166      * @throws Exception
167      */
168     public static void UpdateContact(Context context) throws Exception{  
169         int id = 1;  
170         String phone = "999999";  
171         Uri uri = Uri.parse("content://com.android.contacts/data");//对data表的所有数据操作  
172         ContentResolver resolver = context.getContentResolver();  
173         ContentValues values = new ContentValues();  
174         values.put("data1", phone);  
175         resolver.update(uri, values, "mimetype=? and raw_contact_id=?", new String[]{"vnd.android.cursor.item/phone_v2",id+""}) ;  
176     }  
177     
178     
179     
180 }

用户domain信息类ContactInfo.java,如下:

 1 package com.himi.readcontacts.domain;
 2 
 3 
 4 /**
 5  * 
 6  * 联系人的业务bean
 7  *
 8  */
 9 public class ContactInfo {
10     private String id;
11     private String name;
12     private String email;
13     private String phone;
14     private String qq;
15     public String getId() {
16         return id;
17     }
18     public void setId(String id) {
19         this.id = id;
20     }
21     public String getName() {
22         return name;
23     }
24     public void setName(String name) {
25         this.name = name;
26     }
27     public String getEmail() {
28         return email;
29     }
30     public void setEmail(String email) {
31         this.email = email;
32     }
33     public String getPhone() {
34         return phone;
35     }
36     public void setPhone(String phone) {
37         this.phone = phone;
38     }
39     public String getQQ() {
40         return qq;
41     }
42     public void setQQ(String qq) {
43         this.qq = qq;
44     }
45     @Override
46     public String toString() {//方便System.out.println()打印日志
47         return "ContactInfo [id=" + id + ", name=" + name + ", email=" + email
48                 + ", phone=" + phone + ", qq=" + qq + "]";
49     }
50     
51     
52 
53 }

 

读取ContentProvider之联系人信息,需要添加权限(查看源码可以获知),如下:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.himi.readcontacts"
 4     android:versionCode="1"
 5     android:versionName="1.0" >
 6 
 7     <uses-sdk
 8         android:minSdkVersion="15"
 9         android:targetSdkVersion="17" />
10     <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
11     <uses-permission android:name="android.permission.READ_CONTACTS"/>
12 
13     <application
14         android:allowBackup="true"
15         android:icon="@drawable/ic_launcher"
16         android:label="@string/app_name"
17         android:theme="@style/AppTheme" >
18         <activity
19             android:name=".MainActivity"
20             android:label="@string/app_name" >
21             <intent-filter>
22                 <action android:name="android.intent.action.MAIN" />
23 
24                 <category android:name="android.intent.category.LAUNCHER" />
25             </intent-filter>
26         </activity>
27     </application>
28 
29 </manifest>

 

(3)回到MainActivity.java,如下:

 1 package com.himi.readcontacts;
 2 
 3 import java.util.List;
 4 
 5 import android.app.Activity;
 6 import android.os.Bundle;
 7 import android.view.View;
 8 
 9 import com.himi.readcontacts.domain.ContactInfo;
10 import com.himi.readcontacts.utils.ContactsInfoUtils;
11 
12 public class MainActivity extends Activity {
13 
14     @Override
15     protected void onCreate(Bundle savedInstanceState) {
16         super.onCreate(savedInstanceState);
17         setContentView(R.layout.activity_main);
18     }
19 
20     /**
21      * 
22      * 读取联系人数据库,获取联系人信息
23      */
24     public void click(View view) {         
25         List<ContactInfo> infos = ContactsInfoUtils.getAllContactInfos(this);
26             for(ContactInfo info:infos) {
27                 System.out.println(info.toString());
28             }
29         
30     }
31 
32 }

 

(4)布署到模拟器上,运行的效果如下:

 

观察logcat打印的日志,如下:

09-15 01:36:12.498: I/System.out(911): id1
09-15 01:36:12.549: I/System.out(911): id2
09-15 01:36:12.867: I/System.out(911): ContactInfo [id=1, name=Yjg, email=221112@163.com, phone=34555555555, qq=null]
09-15 01:36:12.867: I/System.out(911): ContactInfo [id=2, name=Yty, email=22222222@163.com, phone=355-5555, qq=null]

posted on 2015-09-14 21:23  鸿钧老祖  阅读(256)  评论(0编辑  收藏  举报

导航