【问题标题】:Get Contacts mobile number only仅获取联系人手机号码
【发布时间】:2011-10-30 04:25:30
【问题描述】:

有几个关于使用联系人 API 获取联系人号码的问题,但我想知道是否有办法识别检索到的号码是手机号码。

以下代码通常用于获取联系人的电话号码,因为它会获取一个或多个电话号码的列表:

String[] projection = {ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.HAS_PHONE_NUMBER};
    String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1";

    Cursor cursor = null;
    Cursor phones = null;
    try
    {
        cursor =  managedQuery(intent.getData(), projection, selection, null, null);
        while (cursor.moveToNext()) 
        {           
            String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
            String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));

            phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId,null, null);
            while (phones.moveToNext()) 
            {               
                String pdata = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA));
                Log.v("DATA",pdata);
            }                           
       }  
    }
    catch (NullPointerException npe)
    {
        Log.e(TAG, "Error trying to get Contacts.");
    }
    finally
    {
        if (phones != null)
        {
            phones.close();
        }
        if (cursor != null)
        {
            cursor.close();
        }           
    } 

虽然这没问题,但有什么方法可以轻松识别电话号码是移动类型(除了尝试使用正则表达式进行模式匹配)。

我怀疑肯定有相关的数据,这样原生应用才能对电话号码进行分类——如下图:

【问题讨论】:

    标签: android contacts


    【解决方案1】:

    我偶然发现了一篇博客文章,它很好地解释了使用 ContactsContract api here

    因此,在上面的示例中,我将上面的部分代码更改为:

    while (phones.moveToNext()) 
    {                   
         int phoneType = phones.getInt(phones.getColumnIndex(Phone.TYPE));
         if (phoneType == Phone.TYPE_MOBILE)
         {
              phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA));
              phoneNumber = phoneNumber.replaceAll("\\s", "");
              break;
         }
    }
    

    这会围绕单个联系人的所有电话循环,如果类型是 Phone.TYPE_MOBILE,则使用这个。

    希望这对遇到同样问题的人有所帮助。

    【讨论】:

    • 简单完美的+1解决方案
    【解决方案2】:

    原始查询 cursor = managedQuery(intent.getData(), projection, selection, null, null);应该能够为您处理过滤器。我正在尝试做同样的事情。完成后我会发布我的发现。如果有人知道如何使用第三个参数中的选择子句来做到这一点。我很想知道答案。

    【讨论】:

      猜你喜欢
      • 2016-12-15
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      • 2015-01-23
      • 2017-06-22
      相关资源
      最近更新 更多