Android基础组件-ContentProvider(二)

来源:互联网 发布:搜索排名优化策划 编辑:程序博客网 时间:2024/05/21 13:55

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
原创粉丝点击