内容提供是实质上是个接口,后门,他给别人提供数据,系统联系人是个比较复杂的内容通过者。
找到/data/data/com.androID.provIDers.contacts/contacts2.db
这个目录下还有个文件contacts2.db.-journal,这个文件和数据库的事务相关
联系人应用数据库的主要结构
raw_contacts 联系人表 contact_ID 联系人ID
data数据表 raw_contact_ID联系人ID,mimetype_ID数据类ID,data1数据
mimetypes类型表 1 email,5 phone,7 name
查询所有的联系人信息:
查询raw_contacts表把联系人ID取出来根据ID查询data表,把所有的数据取出来根据数据的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()方法,返回字段数组,打印一下
这里字段应该是data1和mimetype
调用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,1)">nullwhile(cursor.movetoNext()){ String ID=cursor.getString(cursor.getColumnIndex("contact_ID")); 查找数据表 Cursor dataCursor=resolver.query(dataUri,"raw_contact_ID=?",1)">new String[]{ID},1)">); (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("=========="); }
总结
以上是内存溢出为你收集整理的[android] 获取系统的联系人信息全部内容,希望文章能够帮你解决[android] 获取系统的联系人信息所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)