【问题标题】:Is there a simple way to check if an incoming caller is a contact in Android?有没有一种简单的方法来检查来电者是否是 Android 中的联系人?
【发布时间】:2010-02-03 16:52:00
【问题描述】:

当 Android 手机接到电话时,它会自动检查该电话是否存在于自己的联系人数据库中。我想知道是否有一种简单的方法可以访问该信息。我有一个PhoneStateListener 在响铃状态下执行某些操作,我想检查来电者是否在联系人列表中。

有没有办法在不通过联系人ContentProvider 的情况下做到这一点?

【问题讨论】:

  • 请问您为什么不想通过内容提供商来做?监听来电,检索号码,然后检查内容提供程序中的号码是否合乎逻辑?
  • 你说得对,这将是一个不错的方法,但我想避免它,因为手机“类型”的复杂性。由于用户可以将联系人的电话号码放入任何类别(例如“工作”、“其他”甚至自定义类别),因此尝试搜索所有字段以查找匹配项变得很难看。此外,还需要以标准方式格式化数字。我错过了一些非常简单的东西吗?如果没有,我宁愿完全远离那个烂摊子。
  • 下面 Christopher 的代码应该可以正常工作,我使用类似的方法来检查传出号码,它会检查所有字段,不会在处理过程中出现任何延迟

标签: android contacts telephony


【解决方案1】:

手机应用也使用联系人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();
}

【讨论】:

  • 啊哈!我知道我对某处的 URI 感到困惑!非常感谢,这就像一个魅力。
  • 是的,提供者 URI 会为您完成所有数字格式和匹配。无需担心。
【解决方案2】:

这是 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();
    } 

【讨论】:

  • 我们不能只使用PhoneLookup而不是PhoneLookup吗?
猜你喜欢
  • 2021-06-27
  • 2021-04-25
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 2017-06-21
相关资源
最近更新 更多