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/5
Cursor 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 hongxiao
photo_uri:null
send_to_voicemail:0
contact_status:null
contact_status_label:null
pinned:0
display_name:wang hongxiao
phonebook_label_alt:H
phonebook_bucket:23
contact_status_res_package:null
in_default_directory:1
photo_id:null
custom_ringtone:null
_id:5
times_contacted:0
phonebook_label:W
display_name_alt:hongxiao, wang
lookup:0r5-D9ADC7B9BBC9C7B9DBBDADC9
phonetic_name:null
last_time_contacted:0
contact_last_updated_timestamp:1477791122100
has_phone_number:1
in_visible_group:1
display_name_source:40
photo_file_id:null
is_user_profile:0
contact_status_ts:null
sort_key_alt:hongxiao, wang
phonebook_bucket_alt:8
contact_presence:null
starred:0
photo_thumb_uri:null
contact_status_icon:null
contact_chat_capability:null
phonetic_name_style:0
name_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/5
String[] 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()){
// 联系人ID
id = 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);
}
}
}
}
}
}
ContentProvider中央档案馆,以及获取联系人电话的示例的更多相关文章
- android中ContentProvider获取联系人 总结
35.内容提供者:ContentResolver 用内容提供者来获取联系人信息 35-1:权限 <!-- 对联系人的读.写权限 --> <uses-permission androi ...
- ContentProvider往通讯录添加联系人和获取联系人
public class MainActivity extends Activity { private People people; private List<People> pList ...
- Android 查看联系人电话和姓名(ContentProvider)
1.介绍 2.使用方法 3.在AndroidManifest.xml文件中添加相关设置 <uses-permission android:name="android.permissio ...
- Android(java)学习笔记250:ContentProvider使用之获得系统联系人信息02(掌握)
1.重要: 系统删除一个联系人,默认情况下并不是把这个联系人直接删除掉了,只是做了一个标记,标记为被删除. 2.前面一讲说过了如何获取系统联系人信息(通过ContentProvider),获取联系人信 ...
- Android(java)学习笔记249:ContentProvider使用之获得系统联系人信息01
1.系统联系人的数据库(3张最重要的表) (1)raw_contacts 联系人表 保存联系人的id contact_id (2)data 数据表 保存联系人的数据 ( ...
- Android(java)学习笔记194:ContentProvider使用之获得系统联系人信息02(掌握)
1.重要: 系统删除一个联系人,默认情况下并不是把这个联系人直接删除掉了,只是做了一个标记,标记为被删除. 2.前面一讲说过了如何获取系统联系人信息(通过ContentProvider),获取联系人信 ...
- Android(java)学习笔记193:ContentProvider使用之获得系统联系人信息01
1.系统联系人的数据库(3张最重要的表) (1)raw_contacts 联系人表 保存联系人的id contact_id (2)data 数据表 保存联系人的数据 ( ...
- Android 获取联系人手机号码、姓名、地址、公司、邮箱、生日
public void testGetAllContact() throws Throwable { //获取联系人信息的Uri Uri uri = ContactsContract.Contacts ...
- Android 手机卫士--获取联系人信息并显示与回显
前面的文章已经实现相关的布局,本文接着进行相关的功能实现 本文地址:http://www.cnblogs.com/wuyudong/p/5951794.html,转载请注明出处. 读取系统联系人 当点 ...
随机推荐
- 跨越语言的障碍:C++/CLI 调用 C#
首先我想投诉一下博客园首页右边栏的广告..最近总是出现很恐怖的整容脸的广告.真的是吓坏了.=.=大家有同感吗? 博客园前一阵子掀起了语言的广泛讨论,事实上语言的争执在整个程序员圈子也没有停止过.以我个 ...
- Leetcode 笔记 99 - Recover Binary Search Tree
题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...
- Visual Studio 宏的高级用法
因为自 Visual Studio 2012 开始,微软已经取消了对宏的支持,所以本篇文章所述内容只适用于 Visual Studio 2010 或更早期版本的 VS. 在上一篇中,我已经介绍了如何编 ...
- CSharpGL(11)用C#直接编写GLSL程序
CSharpGL(11)用C#直接编写GLSL程序 +BIT祝威+悄悄在此留下版了个权的信息说: 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharp ...
- C#非常重要基础之多态
前几天看了一位同志的博客,写的是关于他自己去支付宝面试的经历.过程大体是这样的:问答的时候,前面部分,作者都应答如流,说起自己经验如何之丰富,最后面试官问了作者一个问题:请简述多态的概念和作用.结果这 ...
- TODO:从数据库中随机抽取一条记录
TODO:从数据库中随机抽取一条记录 1.最直接,最粗暴的方法先计算记录的总数,然后选择一个从0到记录总数之间的随机数n,利用skip跳过n条记录,这是效率低下的的方法,首先的记录总数,在用skip会 ...
- PHP Excel 下载数据,并分页下载
直接上代码: 调用下载Excel: $total=$duoduo->count(MOD.' as a',$where); $objExcel= SelfExcelObject(); //导出 i ...
- salesforce 零基础学习(五十七)Test 类中创建TestUser帮助类
我们写Test Class的时候往往都需要指定一个uesr去run test method. TestUserHelper类如下: public class TestUserHelper { publ ...
- 同步与异步 & 阻塞与非阻塞
在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 一.同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用 ...
- tornado template
若果使用Tornado进行web开发可能会用到模板功能,页面继承,嵌套... 多页应用模板的处理多半依赖后端(SPA就可以动态加载局部视图),就算是RESTfull的API设计,也不妨碍同时提供部分模 ...