MainActivity
public class MainActivity extends ListActivity {
// 訪問內容提供者時需要的主機名稱
public static final String authority = "com.bqt.contentprovider.person";
private TextView tv_info;
private ContentResolver resolver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String[] array = { "獲取所有數據", "插入一條name=bqt的數據", "修改name=bqt的數據", "刪除name=bqt的數據", "清空所有數據",//
"讀取收件箱信息", "往收件箱插入一條信息", "讀取手機聯系人", "查詢\"110\"的聯系人信息", "添加一個新的聯系人" };
for (int i = 0; i < array.length; i++) {
array[i] = i + "、" + array[i];
}
ListAdapter mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>(Arrays.asList(array)));
resolver = getContentResolver();// 獲取內容解析器
tv_info = new TextView(this);// 將內容顯示在TextView中
tv_info.setTextColor(Color.BLUE);
tv_info.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
tv_info.setPadding(20, 10, 20, 10);
getListView().addFooterView(tv_info);
setListAdapter(mAdapter);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Uri uri = null;
Uri returnUri = null;
StringBuffer sb = new StringBuffer();
int num = 0;
ContentValues values = new ContentValues();// 要修改或插入的數據
switch (position) {
case 0: // 獲取所有數據
uri = Uri.parse("content://" + authority + "/query");// 指定解析器要解析的路徑。注意query前要加路徑分隔符【/】
Log.i("bqt", uri.toString());//【 content://com.bqt.contentprovider.person/query】
Cursor cursor = resolver.query(uri, null, null, null, null);// 獲取解析器解析的結果集
if (cursor != null) {
while (cursor.moveToNext()) {
int uId = cursor.getInt(cursor.getColumnIndex("id"));// 取出需要的內容
String uName = cursor.getString(cursor.getColumnIndex("name"));
String uNumber = cursor.getString(cursor.getColumnIndex("number"));
sb.append("id:" + uId + " name:" + uName + " number:" + uNumber + "\n");
}
tv_info.setText(sb.toString());
cursor.close();
}
break;
case 1:// 插入一條數據
uri = Uri.parse("content://" + authority + "/insert");
values.put("id", new Random().nextInt(10));
values.put("name", "bqt");
values.put("number", "10086");
returnUri = resolver.insert(uri, values);
tv_info.setText("插入信息的uri:" + returnUri.toString());
break;
case 2: // 修改一條數據
uri = Uri.parse("content://" + authority + "/update");
values.put("name", "dog");
values.put("number", "10087");
num = resolver.update(uri, values, "name=?", new String[] { "bqt" });// 指定uri,values,Where子句,占位符的值
tv_info.setText("修改信息個數:" + num);
break;
case 3: // 刪除一條數據
uri = Uri.parse("content://" + authority + "/delete");
num = resolver.delete(uri, "name=?", new String[] { "bqt" });
tv_info.setText("刪除信息個數:" + num);
break;
case 4: // 清空,刪除所有數據
uri = Uri.parse("content://" + authority + "/delete");
num = resolver.delete(uri, null, null);
tv_info.setText("刪除信息個數:" + num);
break;
//******************************************************************************************
case 5: // 讀取收件箱信息
readMsgs();
break;
case 6: // 往收件箱插入一條信息
insertMsg();
break;
case 7: // 讀取手機聯系人
readContact();
break;
case 8: // 查詢指定電話的聯系人信息
queryContact("110");
break;
case 9: // 添加一個新的聯系人
writeContact();
break;
}
}
/** 讀取收件箱信息。<uses-permission android:name="android.permission.READ_SMS"/> */
public void readMsgs() {
Uri uri = Uri.parse("content://sms/");
ContentResolver resolver = getContentResolver();
//獲取的是哪些列的信息
Cursor cursor = resolver.query(uri, new String[] { "address", "date", "type", "body" }, null, null, null);
if (cursor != null) {
StringBuffer sb = new StringBuffer();
while (cursor.moveToNext()) {
sb.append("聯系人:" + cursor.getString(cursor.getColumnIndex("address")));
sb.append("\n時間:" + cursor.getString(cursor.getColumnIndex("date")));
sb.append("\n類型:" + cursor.getString(cursor.getColumnIndex("type")));
sb.append("\n內容:" + cursor.getString(cursor.getColumnIndex("body")));
sb.append("\n===============================\n");
}
tv_info.setText(sb.toString());
cursor.close();
}
}
/**讀取手機收件箱,返回一個集合*/
public ArrayList<String> getSms() {
ArrayList<String> mArrayList = new ArrayList<String>();
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://sms/");
Cursor cursor = resolver.query(uri, new String[] { "body", "address", "type", "date" }, null, null, null);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
while (cursor.moveToNext()) {
String body = "內容:" + cursor.getString(0);
String address = "聯系人:" + cursor.getString(1);
String type = "類型:" + cursor.getString(2);//1是接收到的,2是已發出 ,但是 3 是什么鬼?
String date = "時間:" + formatter.format(new Date(Long.parseLong(cursor.getString(3))));
mArrayList.add(new String(body + "\n" + address + "\n" + type + "\n" + date + "\n\n"));
}
cursor.close();
return mArrayList;
}
/** 往收件箱插入一條信息,"android.permission.WRITE_SMS" 。從5.0開始,默認短信應用外的軟件不能以寫入短信數據庫的形式發短信 */
public void insertMsg() {
ContentValues values = new ContentValues();
values.put("address", "10086");//聯系人
values.put("type", 1);//類型1是"收到"的短信
values.put("date", System.currentTimeMillis());//收到的時間
values.put("body", "您的余額還有1,000,000萬元!");//內容
Uri returnUri = resolver.insert(Uri.parse("content://sms"), values);
if (returnUri != null) {
tv_info.setText(returnUri.toString());
if (returnUri.getPath().equals("/0")) {
Toast.makeText(this, "添加失敗:" + returnUri.getPath(), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "添加成功:" + returnUri.getPath(), Toast.LENGTH_SHORT).show();
}
}
}
/** 讀取手機聯系人 <uses-permission android:name="android.permission.READ_CONTACTS"/> */
public void readContact() {
//查詢raw_contacts表獲得聯系人的id
ContentResolver resolver = getContentResolver();
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
//查詢聯系人數據
Cursor cursor = resolver.query(uri, null, null, null, null);
if (cursor != null) {
StringBuffer sb = new StringBuffer();
while (cursor.moveToNext()) {
sb.append("姓名:" + cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)));
sb.append("\n號碼:" + cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
sb.append("\n===============================\n");
}
tv_info.setText(sb.toString());
cursor.close();
}
cursor.close();
}
/**查詢指定電話的聯系人信息*/
public void queryContact(String number) {
Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/" + number);
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(uri, new String[] { "display_name" }, null, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
String name = cursor.getString(0);
Toast.makeText(this, number + "對應的聯系人名稱:" + name, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, number + "木有此聯系人", Toast.LENGTH_SHORT).show();
}
cursor.close();
}
}
/**讀取手機聯系人,返回一個集合*/
public List<Map<String, String>> getContacts() {
//把所有的聯系人保存在List集合中
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
ContentResolver resolver = getContentResolver();
Uri uriId = Uri.parse("content://com.android.contacts/raw_contacts");//id信息
Uri uriData = Uri.parse("content://com.android.contacts/data");//具體的聯系人信息
//獲取包含id的結果集
Cursor cursor = resolver.query(uriId, new String[] { "contact_id" }, null, null, null);
//遍歷此包含id的結果集
while (cursor.moveToNext()) {
String contact_id = cursor.getString(0);
if (contact_id != null) {
//將對應此id的所有聯系人信息保存在map集合中
Map<String, String> map = new HashMap<String, String>();
Cursor dataCursor = resolver.query(uriData, new String[] { "data1", "mimetype" }, "contact_id=?", new String[] { contact_id }, null);
//遍歷對應此id的所有聯系人信息的結果集
while (dataCursor.moveToNext()) {
String data1 = dataCursor.getString(0);//聯系人信息
String mimetype = dataCursor.getString(1);//此聯系人信息的類型
//若mimetype為聯系人的姓名或電話號碼,則以相應的格式保存在map集合中
if ("vnd.android.cursor.item/name".equals(mimetype)) map.put("name", data1);//保存姓名
else if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) map.put("phone", data1);//保存電話
}
//將map集合中的數據保存在list集合中
list.add(map);
dataCursor.close();
}
}
cursor.close();
return list;
}
/**添加一個新的聯系人。"android.permission.WRITE_CONTACTS" */
public void writeContact() {
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");//保存聯系人的id
Uri dataUri = Uri.parse("content://com.android.contacts/data");//保存聯系人的數據
Cursor cursor = resolver.query(uri, new String[] { "_id" }, null, null, null);// 注意列名是【_id】
if (cursor.moveToLast()) {// 移動到最后一條記錄
int lastId = cursor.getInt(0);// 獲取最后一條記錄【第零列】的值(即id的值)
int newId = lastId + 1;// 設定要插入的記錄的id值
ContentValues values = new ContentValues();
values.put("contact_id", newId);//插入一條記錄
resolver.insert(uri, values);// 向raw_contacts表中插入一條記錄
//電話
ContentValues phoneValues = new ContentValues();
phoneValues.put("data1", "110");//向data1表中插入一條指定的值(電話)
phoneValues.put("mimetype", "vnd.android.cursor.item/phone_v2");//指定這個值是一個電話類型
phoneValues.put("raw_contact_id", newId);//指定這個值(電話)對應哪個id
resolver.insert(dataUri, phoneValues);
//emai
ContentValues emaiValues = new ContentValues();
emaiValues.put("data1", "bqt@qq.com");
emaiValues.put("mimetype", "vnd.android.cursor.item/email_v2");
emaiValues.put("raw_contact_id", newId);
resolver.insert(dataUri, emaiValues);
//姓名
ContentValues nameValues = new ContentValues();
nameValues.put("data1", "包青天");
nameValues.put("mimetype", "vnd.android.cursor.item/name");
nameValues.put("raw_contact_id", newId);
resolver.insert(dataUri, nameValues);
}
cursor.close();
Toast.makeText(this, "添加成功", Toast.LENGTH_SHORT).show();
}
}
清單文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.bqt.contentresolver"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 內容提供者定義的權限 -->
<uses-permission android:name="com.bqt.permission" />
<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>
