首页 > 系统 > Android > 正文

Android基础组件-ContentProvider(二)

2019-11-09 16:46:38
字体:
来源:转载
供稿:网友

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”获取发送队列的短信


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表