18

我做一个BroadcastReceiver接收打电话给我的人的电话号码

<intent-filter>
<action
    android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
  1. 如何检查收到的电话号码是否在我的联系人列表中?
    您是否有提示知道此电话号码是否存在于联系人列表中而未加载联系人列表?
    我不想要更多信息,只要这个电话号码存在。

  2. 如果不可能,我必须加载联系人列表,怎么办BroadcastReceiver
    当我尝试做时getContentResolver,它不起作用,因为我在BroadcastReceiver里面而不是在里面Activity......

谢谢你的帮助

4

4 回答 4

36
public boolean contactExists(Context context, String number) {
    // number is the phone number
    Uri lookupUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
    String[] mPhoneNumberProjection = { PhoneLookup._ID, PhoneLookup.NUMBER, PhoneLookup.DISPLAY_NAME };
    Cursor cur = context.getContentResolver().query(lookupUri, mPhoneNumberProjection, null, null, null);
    try {
        if (cur.moveToFirst()) {
            cur.close();
            return true;
        }
    } finally {
        if (cur != null)
            cur.close();
        }
   }

   return false;
}
于 2010-08-17T19:00:08.507 回答
9

我认为重要的是要说您需要在清单文件中添加以下内容。

<uses-permission android:name="android.permission.READ_CONTACTS" /> 
于 2011-03-04T18:26:15.377 回答
3

对于 1,您应该查看推荐的ContactsContract.PhoneLookup提供程序

表示查找电话号码结果的表格,例如来电显示。要执行查找,您必须将要查找的数字附加到 CONTENT_FILTER_URI。这个查询是高度优化的。

Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
Cursor mycursor=resolver.query(uri, new String[]{PhoneLookup.DISPLAY_NAME,...
if (mycursor!=null && mycursor.moveToFirst()) {
// record exists
}

对于 2,您可以使用contextonReceive 方法调用属于 Context 的方法

ContentResolver cr=context.getContentResolver();
于 2010-08-17T18:54:04.513 回答
3

我建议你使用 Phone.CONTENT_FILTER_URI,而不是PhoneLookup.CONTENT_FILTER_URI 因为 PhoneLookup 可能是空的,你会不时得到任何结果(在 LG-P500 上测试,froyo)

例如,我的设备上的问题发生在:

  1. 切换到飞行模式
  2. 使用默认消息应用程序发送短信(将排队)。
  3. 用于PhoneLookup.CONTENT_FILTER_URI查询联系人

并非所有设备似乎都受到影响

使用PhoneLookup.CONTENT_FILTER_URI返回的游标始终为空。使用Phone.CONTENT_FILTER_URI一切都很好(如果有的话,你会找到联系人)。

因此,我建议您始终使用Phone.*Uris,除非您确实需要使用PhoneLookup.*……这通常只是与通讯录同步相关的东西(而且大多数时候不是您感兴趣的东西)。

于 2011-03-06T14:24:04.617 回答