ContentProvider作为内容提供者,不仅仅只能用于不同程序之间的数据共享,还能用于获取获取系统的数据,也就是系统就相当于一个ContentProvider,然后我们只需要用ContentResolver通过指定的uri去获取系统所提供的数据就可以了。
一般有获取联系人、图库、短信等。
首先联系人的获取有两种:
1.直接通过数据库获取所有的联系人
ContentResolver resolver=getContentResolver();
//获取手机系统内存放联系人的表(raw_contacts)的Uri地址
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
//查询所有的联系人数据
Cursor cursor = resolver.query(uri, null, null, null, null);
while (cursor.moveToNext()) {
//联系人ID
int id = cursor.getInt(cursor.getColumnIndex("_id"));
//联系人姓名
String name=cursor.getString(cursor.getColumnIndex("display_name"));
//联系人的手机号与姓名不在同一张表所以,所以要根据联系人的id再得到data表中对应的数据
Uri Datauri=Uri.parse("content://com.android.contacts/raw_contacts/" + id + "/data");
Cursor Datacursor = resolver.query(Datauri, null, null, null, null);
while (Datacursor.moveToNext()) {
//获得联系人主要存储的数据(手机号/邮箱/....)
String data1 = Datacursor.getString(Datacursor.getColumnIndex("data1"));
//获得data1代表的数据类型
String mimetype = Datacursor.getString(Datacursor.getColumnIndex("mimetype"));
//vnd.android.cursor.item/phone_v2代表的则是手机号
if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) {
Log.i("test","ID:"id+" 姓名:"+name+" 手机号:"+data1 );
}
}
2.直接跳转至手机的联系人界面选择联系人
//跳转到联系人列表
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("vnd.android.cursor.dir/phone");
startActivityForResult(intent, 0x111);
//从其他界面跳回此界面时将执行这个方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 0x111://联系人返回值
//从返回的data中得到选定联系人的uri
Uri uri = data.getData();
//获得选中的联系人的数据
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
while (cursor.moveToNext()) {
//联系人ID
int id = cursor.getInt(cursor.getColumnIndexOrThrow(Contacts.Phones._ID));
//联系人的姓名
String name=cursor.getString(cursor.getColumnIndexOrThrow(Contacts.Phones.NAME));
//联系人手机号码
String number=cursor.getString(cursor.getColumnIndexOrThrow(Contacts.Phones.NUMBER));
}
break;
}
}
在图库中获取图片:
//跳转到系统图库
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, 0x112);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 0x112:
Uri uriimage = data.getData();
try {
if (bmp != null) {
bmp.recycle();
}
//根据返回得uri读取得到选中的图片
bmp=BitmapFactory.decodeStream(getContentResolver().openInputStream(uriimage));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
imageView.setImageBitmap(bmp);
break;
}
}
获取手机中的图片
Uri uri = Uri.parse("content://sms/");
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
while (cursor.moveToNext()) {
/**
*"address"手机号
* "body"短信内容
*/
int id = cursor.getInt(cursor.getColumnIndex("_id"));
String address = cursor.getString(cursor.getColumnIndex("address"));
String date = cursor.getString(cursor.getColumnIndex("date"));
String type = cursor.getString(cursor.getColumnIndex("type"));
String content = cursor.getString(cursor.getColumnIndex("body"));
最后短信分很多种,获取的uri也不一样,提供以下几种类型的uri:
“content://sms/”是获取所有短信,不区分类型
“content://sms/inbox”获取收件箱中的短信
“content://sms/sent”获取已发送的短信
“content://sms/draft”获取草稿箱中的短信
“content://sms/outbox”获取发件件箱中的短信
“content://sms/failed”获取发送失败的短信
“content://sms/queued”获取发送队列的短信