2010-02-03 73 views
6

当Android手机收到一个呼叫时,它会自动检查该呼叫是否存在于其自己的联系人数据库中。我想知道是否有简单的方法来访问这些信息。我有一个PhoneStateListener,在响铃状态下执行某些操作,并且我想检查传入呼叫者是否在联系人列表中。有没有一种简单的方法来检查传入的呼叫者是否是Android中的联系人?

有没有办法做到这一点,而不通过联系人ContentProvider

+0

我可以问你为什么不代码想通过内容提供商来做到这一点? 监听来电,检索号码,然后检查它在内容提供商中是否似乎是合乎逻辑的做法? – 2010-02-03 17:01:50

+0

你是对的,这将是一个体面的方式去,但我想避免它,因为手机“类型”的复杂性。由于用户可以将联系人的电话号码放入任何类别(例如“工作”,“其他”或甚至自定义的电话号码),因此尝试通过搜索所有字段以找到匹配变得很难看。此外,还需要以标准方式对数字进行格式化。我错过了很简单的事情吗?如果不是,我宁愿远离这个混乱。 – gggritso 2010-02-03 17:07:26

+0

Christopher下面的代码应该可以正常工作,我使用类似的东西来检查外出的号码,并且它在处理中检查所有字段没有任何延迟 – 2010-02-03 17:11:28

回答

5

电话应用程序也使用联系人ContentProvider;我不知道为什么你想避免这种情况。此外,它是唯一公开访问该信息的方式。

解决了许多的名(2.0,在这种情况下)是很简单的反正:

Uri uri = Uri.withAppendedPath(Phones.CONTENT_FILTER_URL, Uri.encode(number)); 

String name = null; 
Cursor cursor = context.getContentResolver().query(uri, 
        new String[] { Phones.DISPLAY_NAME }, null, null, null); 
if (cursor != null && cursor.moveToFirst()) { 
    name = cursor.getString(cursor.getColumnIndex(Phones.DISPLAY_NAME)); 
    cursor.close(); 
} 
+0

Aha!我知道我对某些地方的URI感到困惑!非常感谢你,这很有魅力。 – gggritso 2010-02-03 17:15:42

+1

是的,该提供商的URI为你做所有的数字格式和匹配..不需要担心这一点。 – 2010-02-03 17:21:36

3

这里是2.0及更高版本

Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); 
    Cursor cursor = resolver.query(uri, new String[]{PhoneLookup.DISPLAY_NAME}, null, null, null);   

    if (cursor != null && cursor.moveToFirst()) { 
     String name = cursor.getString(0); 
     cursor.close(); 
    } 
+0

而不是PhoneLookup,我们不能只用手机吗? – 2013-08-27 06:48:51

相关问题