Android官方文档介绍的数据存储方式共有五种,sqlite,SharedPreferences,网络存储,外储存储,文件存储,但是这些数据都无法进行共享,那么我们就引入了今天的主角:ContentProvider
  1. ContentProvider:为我们的应用程序之间提供了共享数据的一种机制,比如获取手机里面的通话记录,通讯录,多媒体,图片等;
  2. ContentProvider为数据的存储和获取数据提供了统一的数据接口,它对数据进行了封装,我们不用关心数据存储的细节;
  3. 使用ContentProvider可以在不同的应用程序之间共享数据;
  4. 每一个ContentProvider都拥有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据;
  5. Android为我们提供的ContentProvider,都存放在android.provider包中;
  6. URI介绍
    1. 概念就是为系统的每一个资源给一个名字,比如通话记录;
    2. 每一个ContentProvider都有一个公共的URI,这个URI用于表示这个ContentProvider所提供的的数据;
    3. 每个URI包含四部分
      1. 前缀:比如content://
      2. 标识:用于表示唯一性,外部通过这个标识找到它,一般为该ContentProvider的包+类的名称;
      3. 路径:就是你要操作数据中表的名字
      4. 如果URI中捕获的记录包含该ID,就返回该ID对应的数据,如果没有ID,就返回全部.比如路径可以定义为:
        1. /person/10:返回person表中id为10的记录;
        2. /person/10/name:id为10的记录的name字段;
  7. ContentResolver操作ContentProvider中的数据;可以使用Activity提供的getContentResolver()方法;它有四个相同签名的方法insert,update,delete,query
  8. 获取联系人信息
    1. // 通过隐式意图打开通讯录
    2. Intent intent =newIntent(Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI);
    3. startActivityForResult(intent,1001);
    1. @Override
    2. protectedvoid onActivityResult(int requestCode,int resultCode,Intent data){
    3. super.onActivityResult(requestCode, resultCode, data);
    4. if(requestCode ==1001){
    5. if(resultCode == RESULT_OK){
    6. ContentResolver resolver = getContentResolver();
    7. Uri uri = data.getData();
    8. //uri = content://com.android.contacts/contacts/lookup/0r5-D9ADC7B9BBC9C7B9DBBDADC9/5
    9. Cursor cursor = resolver.query(uri,null,null,null,
    10. null);
    11. if(cursor.moveToFirst()){
    12. for(int i =0; i < cursor.getColumnCount(); i++){
    13. Log.i("-->", cursor.getColumnNames()[i]+":"+ cursor.getString(i));
    14. }
     
    1. sort_key:wang hongxiao
    2. photo_uri:null
    3. send_to_voicemail:0
    4. contact_status:null
    5. contact_status_label:null
    6. pinned:0
    7. display_name:wang hongxiao
    8. phonebook_label_alt:H
    9. phonebook_bucket:23
    10. contact_status_res_package:null
    11. in_default_directory:1
    12. photo_id:null
    13. custom_ringtone:null
    14. _id:5
    15. times_contacted:0
    16. phonebook_label:W
    17. display_name_alt:hongxiao, wang
    18. lookup:0r5-D9ADC7B9BBC9C7B9DBBDADC9
    19. phonetic_name:null
    20. last_time_contacted:0
    21. contact_last_updated_timestamp:1477791122100
    22. has_phone_number:1
    23. in_visible_group:1
    24. display_name_source:40
    25. photo_file_id:null
    26. is_user_profile:0
    27. contact_status_ts:null
    28. sort_key_alt:hongxiao, wang
    29. phonebook_bucket_alt:8
    30. contact_presence:null
    31. starred:0
    32. photo_thumb_uri:null
    33. contact_status_icon:null
    34. contact_chat_capability:null
    35. phonetic_name_style:0
    36. name_raw_contact_id:5
    通过分析,我们可以得到我们关心的三个字段
    1. @Override
    2. protectedvoid onActivityResult(int requestCode,int resultCode,Intent data){
    3. super.onActivityResult(requestCode, resultCode, data);
    4. if(requestCode ==1001){
    5. if(resultCode == RESULT_OK){
    6. int id;
    7. String name;
    8. String phone;
    9. ContentResolver resolver = getContentResolver();
    10. Uri uri = data.getData();
    11. // uri = content://com.android.contacts/contacts/lookup/0r5-D9ADC7B9BBC9C7B9DBBDADC9/5
    12. String[] projection =newString[]{ContactsContract.Contacts.DISPLAY_NAME,ContactsContract.Contacts
    13. ._ID,ContactsContract.Contacts.HAS_PHONE_NUMBER};
    14. Cursor cursor = resolver.query(uri, projection,null,null,null);
    15. if(cursor.moveToFirst()){
    16. // 联系人ID
    17. id = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));
    18. // 联系人姓名
    19. name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
    20. // 是否有电话的个数
    21. int has_phone_number = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts
    22. .HAS_PHONE_NUMBER));
    23. if(has_phone_number >0){
    24. String selection =ContactsContract.CommonDataKinds.Phone._ID +"=?";
    25. String[] selectionArgs =newString[]{id +""};
    26. // 如果用Android6.0,会报错,因为需要获取运行时权限
    27. Cursor cursor2 = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,
    28. selection, selectionArgs,null);
    29. if(cursor2.moveToFirst()){
    30. phone = cursor2.getString(cursor2.getColumnIndex(ContactsContract.CommonDataKinds
    31. .Phone.DATA1));
    32. tv_phone_number.setText("id:"+ id +"\n姓名:"+ name +"\n电话个数:"+
    33. has_phone_number +"\n电话号码:"+ phone);
    34. }
    35. }
    36. }
    37. }
    38. }
    39. }
     
 

ContentProvider中央档案馆,以及获取联系人电话的示例的更多相关文章

  1. android中ContentProvider获取联系人 总结

    35.内容提供者:ContentResolver 用内容提供者来获取联系人信息 35-1:权限 <!-- 对联系人的读.写权限 --> <uses-permission androi ...

  2. ContentProvider往通讯录添加联系人和获取联系人

    public class MainActivity extends Activity { private People people; private List<People> pList ...

  3. Android 查看联系人电话和姓名(ContentProvider)

    1.介绍 2.使用方法 3.在AndroidManifest.xml文件中添加相关设置 <uses-permission android:name="android.permissio ...

  4. Android(java)学习笔记250:ContentProvider使用之获得系统联系人信息02(掌握)

    1.重要: 系统删除一个联系人,默认情况下并不是把这个联系人直接删除掉了,只是做了一个标记,标记为被删除. 2.前面一讲说过了如何获取系统联系人信息(通过ContentProvider),获取联系人信 ...

  5. Android(java)学习笔记249:ContentProvider使用之获得系统联系人信息01

    1.系统联系人的数据库(3张最重要的表) (1)raw_contacts  联系人表        保存联系人的id   contact_id (2)data 数据表       保存联系人的数据 ( ...

  6. Android(java)学习笔记194:ContentProvider使用之获得系统联系人信息02(掌握)

    1.重要: 系统删除一个联系人,默认情况下并不是把这个联系人直接删除掉了,只是做了一个标记,标记为被删除. 2.前面一讲说过了如何获取系统联系人信息(通过ContentProvider),获取联系人信 ...

  7. Android(java)学习笔记193:ContentProvider使用之获得系统联系人信息01

    1.系统联系人的数据库(3张最重要的表) (1)raw_contacts  联系人表        保存联系人的id   contact_id (2)data 数据表       保存联系人的数据 ( ...

  8. Android 获取联系人手机号码、姓名、地址、公司、邮箱、生日

    public void testGetAllContact() throws Throwable { //获取联系人信息的Uri Uri uri = ContactsContract.Contacts ...

  9. Android 手机卫士--获取联系人信息并显示与回显

    前面的文章已经实现相关的布局,本文接着进行相关的功能实现 本文地址:http://www.cnblogs.com/wuyudong/p/5951794.html,转载请注明出处. 读取系统联系人 当点 ...

随机推荐

  1. 自定义Sublime Text的图标

    sublime text很赞,windows上最接近mac逼格的轻量编辑器,对于我这样比较喜欢格调的人来说,简直不二之选啊. 美中不足的是,看久了觉得它的图标似乎不是很上心.现在都流行扁平化了而它还停 ...

  2. ABP源码分析五:ABP初始化全过程

    ABP在初始化阶段做了哪些操作,前面的四篇文章大致描述了一下. 为个更清楚的描述其脉络,做了张流程图以辅助说明.其中每一步都涉及很多细节,难以在一张图中全部表现出来.每一步的细节(会涉及到较多接口,类 ...

  3. 解析大型.NET ERP系统 单据编码功能实现

    单据编码是ERP系统中必备的功能,用于生成各种单据的流水号,常常借助于日期时间等字符来生成一个唯一的单据号码.从软件的角度来说,就是为生成数据表的主键值(参考编号),从用户的角度来说,就是给业务单据制 ...

  4. iOS APP 如何做才安全

    本来 写了一篇<iOS 如何做才安全--逆向工程 - Reveal.IDA.Hopper.https抓包 等>,发现文章有点杂,并且“iOS 如何做才安全”这部分写的越来越多,觉得 分出来 ...

  5. .NET Core下的日志(2):日志模型详解

    NET Core的日志模型主要由三个核心对象构成,它们分别是Logger.LoggerProvider和LoggerFactory.总的来说,LoggerProvider提供一个具体的Logger对象 ...

  6. Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'(2)

    center os服务器上搭建discuz论坛初始化程序的时候出现的.我把localhost改成127.0.0.1解决了这个问题.

  7. 如何在删除ibdata1和ib_logfile的情况下恢复MySQL数据库

    昨天,有个朋友对公司内部使用的一个MySQL实例开启binlog,但是在启动的过程中失败了(他也没提,为何会失败),在启动失败后,他删除了ibdata1和ib_logfile,后来,能正常启动了,但所 ...

  8. 从xfire谈WebService接口化编程

    前段时间有博友在看我的博文<WebService入门案例>后,发邮件问我关于WebService 接口在java中的开发,以及在实际生产环境中的应用.想想自己入职也有一段时间了,似乎也该总 ...

  9. 【分布式】Zookeeper与Paxos

    一.前言 在学习了Paxos在Chubby中的应用后,接下来学习Paxos在开源软件Zookeeper中的应用. 二.Zookeeper Zookeeper是一个开源的分布式协调服务,其设计目标是将那 ...

  10. 行为驱动开发(BDD)实践示例

    引言 BDD是对TDD理念的扩展.BDD强调有利害关系的技术团体和非技术团队都要参与到软件开发过程中.可以把它看成一种强调团体间合作的敏捷方法.大多数采用某种敏捷方法的团队最终都会遵循BDD的许多原则 ...