我让BroadcastReceiver
接收给我打电话的人的电话号码
<intent-filter>
<action
android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
如何检查电话号码是否在我的联系人列表中? 您是否有提示知道这个电话号码是否存在于联系人列表中且没有加载联系人列表? 我不想要更多信息,只要这个电话号码存在。
如果不可能,我必须加载联系人列表,如何在BroadcastReceiver
上执行此操作?
当我尝试getContentResolver
时,它无效,因为我在BroadcastReceiver
而不在Activity
内...
感谢您的帮助
答案 0 :(得分:33)
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()) {
return true;
}
} finally {
if (cur != null)
cur.close();
}
return false;
}
答案 1 :(得分:9)
我认为您需要在清单文件中添加以下内容非常重要。
<uses-permission android:name="android.permission.READ_CONTACTS" />
答案 2 :(得分:3)
为1,您应该查看推荐的ContactsContract.PhoneLookup提供商
表示查找电话号码的结果的表格,例如来电者ID。要执行查找,您必须将要查找的数字附加到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
}
for 2你可以使用onReceive方法中的context
来调用属于Context的方法
ContentResolver cr=context.getContentResolver();
答案 3 :(得分:3)
我建议您使用Phone.CONTENT_FILTER_URI
代替PhoneLookup.CONTENT_FILTER_URI
因为PhoneLookup可能是空的,你不会得到任何结果(在LG-P500上测试,froyo)
我的设备上的问题发生在例如:
PhoneLookup.CONTENT_FILTER_URI
查询联系人并非所有设备似乎都受到影响
使用PhoneLookup.CONTENT_FILTER_URI
返回的游标始终为空。
使用Phone.CONTENT_FILTER_URI
一切正常(如果有的话,你会找到联系人)。
因此我建议你总是使用Phone.*
Uris,除非你真的需要使用PhoneLookup.*
...这通常只是地址簿同步相关的东西(而且大部分时间都不是你的有兴趣)。