Android(java)学习笔记250:ContentProvider使用之获得系统联系人信息02(掌握)
2015-09-14 21:23
681 查看
1.重要:
系统删除一个联系人,默认情况下并不是把这个联系人直接删除掉了,只是做了一个标记,标记为被删除。
2.前面一讲说过了如何获取系统联系人信息(通过ContentProvider),获取联系人信息是经常使用,下面封装成工具类,方便以后调用:
下面通过案例说明一下:
(1)Android工程如下图:
(2)其中工具类ContactInfoUtils.java,如下:
用户domain信息类ContactInfo.java,如下:
读取ContentProvider之联系人信息,需要添加权限(查看源码可以获知),如下:
(3)回到MainActivity.java,如下:
(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]
系统删除一个联系人,默认情况下并不是把这个联系人直接删除掉了,只是做了一个标记,标记为被删除。
2.前面一讲说过了如何获取系统联系人信息(通过ContentProvider),获取联系人信息是经常使用,下面封装成工具类,方便以后调用:
下面通过案例说明一下:
(1)Android工程如下图:
(2)其中工具类ContactInfoUtils.java,如下:
package com.himi.readcontacts.utils; import java.util.ArrayList; import java.util.List; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.provider.ContactsContract.Data; import com.himi.readcontacts.domain.ContactInfo; /** * 联系人信息的工具类 * @author Administrator * */ public class ContactsInfoUtils { /** * 根据电话号码查询姓名 * @param context 上下文 * @return 返回 */ public static String getContactByPhone(Context context,String phone)throws Exception{ //uri= content://com.android.contacts/data/phones/filter/# Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/"+phone); ContentResolver resolver = context.getContentResolver(); Cursor cursor = resolver.query(uri, new String[]{Data.DISPLAY_NAME}, null, null, null); //从raw_contact表中返回display_name if(cursor.moveToFirst()){ System.out.println("name="+cursor.getString(0)); } String result = cursor.getString(0); return result; } /** * 查询所有联系人信息 * @param context 上下文 * @return */ public static List<ContactInfo> getAllContactInfos(Context context) { List<ContactInfo> infos = new ArrayList<ContactInfo>(); ContentResolver resolver = context.getContentResolver(); Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); Uri datauri = Uri.parse("content://com.android.contacts/data"); Cursor cursor = resolver.query(uri, new String[] { "contact_id" }, null, null, null); while (cursor.moveToNext()) { String id = cursor.getString(0); ContactInfo info = new ContactInfo(); info.setId(id); System.out.println("id"+id); if (id != null) { // 根据id查询data表,把这个联系人的数据获取出来 Cursor dataCursor = resolver.query(datauri, new String[] { "data1", "mimetype" }, "raw_contact_id=?", new String[] { id }, null); while (dataCursor.moveToNext()) { String data1 = dataCursor.getString(0); String mimetype = dataCursor.getString(1); if (data1 != null && mimetype != null) { if ("vnd.android.cursor.item/email_v2".equals(mimetype)) {// email info.setEmail(data1); } else if ("vnd.android.cursor.item/im" .equals(mimetype)) {// QQ info.setQQ(data1); } else if ("vnd.android.cursor.item/name" .equals(mimetype)) {// name info.setName(data1); } else if ("vnd.android.cursor.item/phone_v2" .equals(mimetype)) {// phone info.setPhone(data1); } } } infos.add(info); dataCursor.close(); } } cursor.close(); return infos; } /** * 添加一个联系人 * @param context 上下文 * @param phone 添加联系人的电话 * @param name 添加联系人的姓名 * @param email 添加联系人的email */ public static void AddContact(Context context, String phone, String name, String email)throws Exception { Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); Uri datauri = Uri.parse("content://com.android.contacts/data"); ContentResolver resolver = context.getContentResolver(); //1.在raw_contace表里面添加一条新的id _id desc:表示按照id降序排列 Cursor cursor = resolver.query(uri, new String[]{"_id"}, null, null, "_id desc"); cursor.moveToFirst(); int _id = cursor.getInt(0);//之前,降序排列,这里获得表中最大id值 //计算出来新添加的条目的id int newId = _id+1; ContentValues values = new ContentValues(); values.put("contact_id", newId); resolver.insert(uri, values); //2.在data表中添加对应的数据 //添加电话号码phone ContentValues phoneValue = new ContentValues(); phoneValue.put("raw_contact_id", newId); phoneValue.put("mimetype", "vnd.android.cursor.item/phone_v2"); phoneValue.put("data1", phone); resolver.insert(datauri, phoneValue); //添加姓名 ContentValues nameValue = new ContentValues(); nameValue.put("raw_contact_id", newId); nameValue.put("mimetype", "vnd.android.cursor.item/name"); nameValue.put("data1", name); resolver.insert(datauri, nameValue); //添加email ContentValues emailValue = new ContentValues(); emailValue.put("raw_contact_id", newId); emailValue.put("mimetype", "vnd.android.cursor.item/email_v2"); emailValue.put("data1", email); resolver.insert(datauri, emailValue); } /** * 删除一个联系人 * * 核心思想: * (1)先在raw_contacts表根据姓名(此处的姓名为name记录的data2的数据而不是data1的数据)查出id; * (2)在data表中只要raw_contact_id匹配的都删除; * @param context 上下文 * @param name 删除用户的姓名 */ public static boolean DeleteContact(Context context,String name)throws Exception{ boolean status = false; //根据姓名求id Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); ContentResolver resolver = context.getContentResolver(); Cursor cursor = resolver.query(uri, new String[]{Data._ID},"display_name=?", new String[]{name}, null); if(cursor.moveToFirst()){ int id = cursor.getInt(0); //根据id删除data中的相应数据 resolver.delete(uri, "display_name=?", new String[]{name}); uri = Uri.parse("content://com.android.contacts/data"); //根据id清空raw_contact_id resolver.delete(uri, "raw_contact_id=?", new String[]{id+""}); status = true; } return status; } /** * 更新联系人 * 核心思想: * (1)不需要更新raw_contacts,只需要更新data表; * (2)uri=content://com.android.contacts/data 表示对data表进行操作; * @param context * @throws Exception */ public static void UpdateContact(Context context) throws Exception{ int id = 1; String phone = "999999"; Uri uri = Uri.parse("content://com.android.contacts/data");//对data表的所有数据操作 ContentResolver resolver = context.getContentResolver(); ContentValues values = new ContentValues(); values.put("data1", phone); resolver.update(uri, values, "mimetype=? and raw_contact_id=?", new String[]{"vnd.android.cursor.item/phone_v2",id+""}) ; } }
用户domain信息类ContactInfo.java,如下:
package com.himi.readcontacts.domain; /** * * 联系人的业务bean * */ public class ContactInfo { private String id; private String name; private String email; private String phone; private String qq; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getQQ() { return qq; } public void setQQ(String qq) { this.qq = qq; } @Override public String toString() {//方便System.out.println()打印日志 return "ContactInfo [id=" + id + ", name=" + name + ", email=" + email + ", phone=" + phone + ", qq=" + qq + "]"; } }
读取ContentProvider之联系人信息,需要添加权限(查看源码可以获知),如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.himi.readcontacts" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.WRITE_CONTACTS"/> <uses-permission android:name="android.permission.READ_CONTACTS"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
(3)回到MainActivity.java,如下:
package com.himi.readcontacts; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.view.View; import com.himi.readcontacts.domain.ContactInfo; import com.himi.readcontacts.utils.ContactsInfoUtils; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /** * * 读取联系人数据库,获取联系人信息 */ public void click(View view) { List<ContactInfo> infos = ContactsInfoUtils.getAllContactInfos(this); for(ContactInfo info:infos) { System.out.println(info.toString()); } } }
(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]
相关文章推荐
- Android——Handler和AsyncTask的使用
- Android--Touch 事件的分发和消费机制
- android学习之路之ListView
- android 分辨率自适应
- Android, 启动活动的最佳写法
- Android, 随时随地退出程序ActivityCollector
- 作业一:android开发平台的演变以及Android Studio设置
- 浅谈Android的三种数据持久化技术之数据库存储
- Android, Activity四种启动模式
- Android之文件读写
- Android之短信发送器
- Android中ViewPager(让用户可以左右切换当前的view)
- 广播接收器的使用
- Android Studio(十):添加assets目录
- Android Studio(十):添加assets目录
- Android 5.0之后获取设备顶层包名问题
- 在android中使用MVP模式
- 在Android程序中使用全局变量
- 【Android开发】UncaughtExceptionHandler接口详解
- Android Studio系列教程六--Gradle多渠道打包