仅获取联系人手机号码

时间:2011-08-18 21:51:36

标签: android contacts

关于使用Contacts 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();
        }           
    } 

虽然这样做没问题,但是有没有办法轻易确定电话号码是移动电话类型(除了尝试与Regex进行模式匹配)。

我怀疑必须有相关的数据,以便原生应用可以对电话号码进行分类 - 如下图所示:

Phone types in Contact info

2 个答案:

答案 0 :(得分:25)

我偶然发现了一篇博客文章,该文章对使用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 :(得分:1)

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