• [android] 获取系统的联系人信息


    内容提供是实质上是个接口,后门,他给别人提供数据,系统联系人是个比较复杂的内容通过者。

    找到/data/data/com.android.providers.contacts/contacts2.db

    这个目录下还有个文件contacts2.db.-journal,这个文件和数据库的事务相关

    联系人应用数据库的主要结构

    raw_contacts 联系人表 contact_id 联系人id

    data数据表  raw_contact_id联系人idmimetype_id数据类iddata1数据

    mimetypes类型表 1 email5 phone7 name

    查询所有的联系人信息:

    1. 查询raw_contacts表把联系人id取出来
    2. 根据id查询data表,把所有的数据取出来
    3. 根据数据的mimetype_id查询mimetypes表获取数据的业务类型

    查询系统源代码,找到providers/Contacts相关的,先找清单文件,看到<Provider>节点,name属性和authories属性,主机名部分是分号隔开的contacts;com.android.contacts 低版本是前一个,高版本是后一个。

    找到源码定义规则的地方UriMatcher对象的地方,看实际规则,一般是表名,因此实际Uri路径是 content://com.android.contacts/表名

    获取ContentResolver对象,调用对象的query(uri)方法,参数:Uri就是路径

    得到Cursor对象,循环Cursor对象

    读取content://com.android.contacts/raw_contacts没问题

    读取content://com.android.contacts/data 时出现错误,mimetype_id字段不存在,实际走的视图表,当你不确定字段的时候,调用Cursor对象的getColumnNames()方法,返回字段数组,打印一下

    这里字段应该是data1mimetype

    调用Cursor对象的query()方法,注意写上条件,”raw_contact_id=?” 和值new String[]{id}

    世面上的很多应用都是取出了联系人的信息,社交应用一般都有发送信息给对方,读取系统联系人

    需要定义权限:<uses-permission android:name="android.permission.READ_CONTACTS"/>

     注意:如果一个账号被删除了,他不是真正的删除而是把raw_contacts表里面的contact_id写为null了,查询的时候应该加个判断是否为空!=null

    activity:

            ContentResolver resolver=getContentResolver();
            Uri uri=Uri.parse("content://com.android.contacts/raw_contacts");
            Uri dataUri=Uri.parse("content://com.android.contacts/data");
            //循环联系人表
            Cursor cursor=resolver.query(uri, null, null, null, null);
            while(cursor.moveToNext()){
                String id=cursor.getString(cursor.getColumnIndex("contact_id"));
                //查找数据表
                Cursor dataCursor=resolver.query(dataUri, null,"raw_contact_id=?", new String[]{id}, null);
                while(dataCursor.moveToNext()){
                    String data1=dataCursor.getString(dataCursor.getColumnIndex("data1"));
                    String mimetype=dataCursor.getString(dataCursor.getColumnIndex("mimetype")); 
                    System.out.println("data1:"+data1+",mimetype:"+mimetype);
                }
                System.out.println("==========");
            }

  • 相关阅读:
    常忘知识点一:嵌套属性
    button按钮的状态为disabled禁用状态,click事件无法触发,但是为什么touchstart下却依然可以触发
    shell
    sql help cs
    再次写给我们这些浮躁的程序员
    C# winform进度条 (异步)
    关于C# WinForm中进度条的实现方法
    Oracle 多行记录合并/连接/聚合字符串的几种方法
    PL/SQL编码规范的一些建议
    PL/SQL 日期时间类型函数及运算
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5277651.html
Copyright © 2020-2023  润新知