ContentProvider :多个应用之间实现数据共享。
继承contenrProvider的类,在重写提供数据存储和提供数据的方法时,可实现向其他应用程序共享数据。
package com.huyanrui.getphonebook;
import java.util.ArrayList;
import android.content.ContentProviderOperation;
import android.content.ContentProviderResult;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.Contacts.Phones;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.Contacts.Data;
import android.provider.ContactsContract.RawContacts;
import android.test.AndroidTestCase;
import android.util.Log;
/**
* 通讯录操作示例
* */
public class MyContentProvider extends AndroidTestCase {
private static final String TAG = "ContactTest";
private Context context;
MyContentProvider (Context context){
this.context = context;
}
/**
* 1.获取同通讯录中所有的联系人
*/
// public Cursor testGetContacts() throws Throwable {
// ContentResolver contentResolver = context.getContentResolver();
// String uriStr = "content://com.android.contacts/contacts";
// String uriStr = Phones.CONTENT_URI.toString();
// Uri uri = Uri.parse(uriStr);
// Cursor cursor = contentResolver.query(uri, null, null, null, null);
// Log.d("debug", ""+cursor.getCount());
// // 遍历联系人
// while (cursor.moveToNext()) {
// // 联系人 ID
// int contactId = cursor.getInt(cursor
// .getColumnIndex(ContactsContract.Contacts._ID));
// // 联系人显示名称
// String name = cursor.getString(cursor
// .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
//
// // 联系人电话号码需要对另一个 uri
// // 进行查询:content://com.android.contacts/data/phones
// Cursor phones = getContext().getContentResolver().query(
// ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
// null,
// ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = "
// + contactId, null, null);
// String phone = "";
// while (phones.moveToNext()) {
// phone = phones
// .getString(phones
// .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));// "data1"
// }
//
// // 获取 Email 需要对另一个 uri 进行查询 :
// // content://com.android.contacts/data/emails
// Cursor emails = getContext().getContentResolver().query(
// ContactsContract.CommonDataKinds.Email.CONTENT_URI,
// null,
// ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = "
// + contactId, null, null);
// while (emails.moveToNext()) {
// String emailAddress = emails
// .getString(emails
// .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));// "data1"
// Log.d("RongActivity", "emailAddress=" + emailAddress);
// }
// emails.close();
// Log.d(TAG, "Contact [contactId= " + contactId + "name=" + name
// + ", phone=" + phone + "]");
// }
// return cursor;
// }
/**
* 2.首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId
* 这时后面插入data表的依据,只有执行空值插入,才能使插入的联系人在通讯录里面可见
*/
public void testInsert(ContentValues valu) {
ContentValues values = new ContentValues();
// 首先向RawContacts.CONTENT_URI执行一个空值插入(raw_contacts 表), 为了获取生成的联系人 ID
Uri rawContactUri = context.getContentResolver()
.insert(RawContacts.CONTENT_URI, values);
// 然后获取系统返回的rawContactId , 就是新加入的这个联系人的 ID
long rawContactId = ContentUris.parseId(rawContactUri);
// Andorid 中,将联系人的姓名、电话、Email 分别存放在 data 表的同一个字段的三条记录当中 因此要 Insert 三次
// 往data表入姓名数据
values.clear();
// raw_contacts_id 字段,是 raw_contacts表id 的外键,用于说明此记录属于哪一个联系人
values.put(Data.RAW_CONTACT_ID, rawContactId);
// mimitype_id 字段,用于描述此数据的类型,电话号码?Email?....
values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
values.put(StructuredName.GIVEN_NAME, valu.get("name").toString());
context.getContentResolver()
.insert(android.provider.ContactsContract.Data.CONTENT_URI,
values);
// 往data表入电话数据
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
values.put(Phone.NUMBER,valu.get("number").toString());
values.put(Phone.TYPE, Phone.TYPE_MOBILE);
context.getContentResolver()
.insert(android.provider.ContactsContract.Data.CONTENT_URI,
values);
// 往data表入Email数据
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
values.put(Email.DATA, "[email protected]");
values.put(Email.TYPE, Email.TYPE_WORK);
context.getContentResolver()
.insert(android.provider.ContactsContract.Data.CONTENT_URI,
values);
}
// /**
// * 在同一个事务当中保存联系人
// */
// public void testSave() throws Throwable {
// // 文档位置:reference\android\provider\ContactsContract.RawContacts.html
// ArrayList ops = new ArrayList();
// int rawContactInsertIndex = ops.size();
// ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
// .withValue(RawContacts.ACCOUNT_TYPE, null)
// .withValue(RawContacts.ACCOUNT_NAME, null).build());
// // 文档位置:reference\android\provider\ContactsContract.Data.html
// ops.add(ContentProviderOperation
// .newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
// .withValueBackReference(Data.RAW_CONTACT_ID,
// rawContactInsertIndex)
// .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
// .withValue(StructuredName.GIVEN_NAME, "赵薇").build());
// // 更新手机号码:Data.RAW_CONTACT_ID 获取上一条语句插入联系人时产生的 ID
// ops.add(ContentProviderOperation
// .newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
// .withValueBackReference(Data.RAW_CONTACT_ID,
// rawContactInsertIndex)
// .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
// .withValue(Phone.NUMBER, "13671323809")
// // "data1"
// .withValue(Phone.TYPE, Phone.TYPE_MOBILE)
// .withValue(Phone.LABEL, "手机号").build());
// ops.add(ContentProviderOperation
// .newInsert(android.provider.ContactsContract.Data.CONTENT_URI)
// .withValueBackReference(Data.RAW_CONTACT_ID,
// rawContactInsertIndex)
// .withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE)
// .withValue(Email.DATA, "[email protected]")
// .withValue(Email.TYPE, Email.TYPE_WORK).build());
//
// // 批量插入 -- 在同一个事务当中
// ContentProviderResult[] results = context
// .getContentResolver()
// .applyBatch(ContactsContract.AUTHORITY, ops);
// for (ContentProviderResult result : results) {
// Log.i(TAG, result.uri.toString());
// }
// }
}
第一个类的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="name=张三 num= 12345678" />
<Button android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="插入" android:id="@+id/btn" />
<ListView android:id="@+id/list" android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>