Android基础组件-ContentProvider(二)

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值