ContentProvider中央档案馆,以及获取联系人电话的示例
Android官方文档介绍的数据存储方式共有五种,sqlite,SharedPreferences,网络存储,外储存储,文件存储,但是这些数据都无法进行共享,那么我们就引入了今天的主角:ContentProvider
- ContentProvider:为我们的应用程序之间提供了共享数据的一种机制,比如获取手机里面的通话记录,通讯录,多媒体,图片等;
- ContentProvider为数据的存储和获取数据提供了统一的数据接口,它对数据进行了封装,我们不用关心数据存储的细节;
- 使用ContentProvider可以在不同的应用程序之间共享数据;
- 每一个ContentProvider都拥有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据;
- Android为我们提供的ContentProvider,都存放在android.provider包中;
- URI介绍
- 概念就是为系统的每一个资源给一个名字,比如通话记录;
- 每一个ContentProvider都有一个公共的URI,这个URI用于表示这个ContentProvider所提供的的数据;
- 每个URI包含四部分
- 前缀:比如content://
- 标识:用于表示唯一性,外部通过这个标识找到它,一般为该ContentProvider的包+类的名称;
- 路径:就是你要操作数据中表的名字
- 如果URI中捕获的记录包含该ID,就返回该ID对应的数据,如果没有ID,就返回全部.比如路径可以定义为:
- /person/10:返回person表中id为10的记录;
- /person/10/name:id为10的记录的name字段;
- ContentResolver操作ContentProvider中的数据;可以使用Activity提供的getContentResolver()方法;它有四个相同签名的方法insert,update,delete,query
- 获取联系人信息
// 通过隐式意图打开通讯录Intent intent =newIntent(Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI);startActivityForResult(intent,1001);
- @Override
protectedvoid onActivityResult(int requestCode,int resultCode,Intent data){super.onActivityResult(requestCode, resultCode, data);if(requestCode ==1001){if(resultCode == RESULT_OK){ContentResolver resolver = getContentResolver();Uri uri = data.getData();//uri = content://com.android.contacts/contacts/lookup/0r5-D9ADC7B9BBC9C7B9DBBDADC9/5Cursor cursor = resolver.query(uri,null,null,null,null);if(cursor.moveToFirst()){for(int i =0; i < cursor.getColumnCount(); i++){Log.i("-->", cursor.getColumnNames()[i]+":"+ cursor.getString(i));}
sort_key:wang hongxiaophoto_uri:nullsend_to_voicemail:0contact_status:nullcontact_status_label:nullpinned:0display_name:wang hongxiaophonebook_label_alt:Hphonebook_bucket:23contact_status_res_package:nullin_default_directory:1photo_id:nullcustom_ringtone:null_id:5times_contacted:0phonebook_label:Wdisplay_name_alt:hongxiao, wanglookup:0r5-D9ADC7B9BBC9C7B9DBBDADC9phonetic_name:nulllast_time_contacted:0contact_last_updated_timestamp:1477791122100has_phone_number:1in_visible_group:1display_name_source:40photo_file_id:nullis_user_profile:0contact_status_ts:nullsort_key_alt:hongxiao, wangphonebook_bucket_alt:8contact_presence:nullstarred:0photo_thumb_uri:nullcontact_status_icon:nullcontact_chat_capability:nullphonetic_name_style:0name_raw_contact_id:5
通过分析,我们可以得到我们关心的三个字段- @Override
protectedvoid onActivityResult(int requestCode,int resultCode,Intent data){super.onActivityResult(requestCode, resultCode, data);if(requestCode ==1001){if(resultCode == RESULT_OK){int id;String name;String phone;ContentResolver resolver = getContentResolver();Uri uri = data.getData();// uri = content://com.android.contacts/contacts/lookup/0r5-D9ADC7B9BBC9C7B9DBBDADC9/5String[] projection =newString[]{ContactsContract.Contacts.DISPLAY_NAME,ContactsContract.Contacts._ID,ContactsContract.Contacts.HAS_PHONE_NUMBER};Cursor cursor = resolver.query(uri, projection,null,null,null);if(cursor.moveToFirst()){// 联系人IDid = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));// 联系人姓名name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));// 是否有电话的个数int has_phone_number = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));if(has_phone_number >0){String selection =ContactsContract.CommonDataKinds.Phone._ID +"=?";String[] selectionArgs =newString[]{id +""};// 如果用Android6.0,会报错,因为需要获取运行时权限Cursor cursor2 = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,selection, selectionArgs,null);if(cursor2.moveToFirst()){phone = cursor2.getString(cursor2.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA1));tv_phone_number.setText("id:"+ id +"\n姓名:"+ name +"\n电话个数:"+has_phone_number +"\n电话号码:"+ phone);}}}}}}
世界上没有什么事情是跑步解决不了的,如果有,那就再跑一会!

浙公网安备 33010602011771号