2011-08-18 165 views
10

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

虽然,这个工作好,有没有什么办法轻松识别电话号码是移动类型(除了试图与正则表达式匹配)。

我怀疑必须有一个相关的数据块,从而使本机应用程序可以将手机号码分类 - 如在下面的图片:

Phone types in Contact info

回答

22

我偶然发现了一篇博客文章,其给出了一个漂亮使用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则借此一。

希望这可以帮助与我有同样问题的人。

+0

简单而完美的+1解决方案 –

1

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