当前位置: 首页 > 面试题库 >

在Android中使用ContactsContract检索电话号码-功能不起作用

鲁华灿
2023-03-14
问题内容

我编写了以下函数,以检索属于ID为“ contactID”的联系人的单个电话号码。

检索电话号码的功能:

private String getContactPhone(String contactID) {
    Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
    String[] projection = null;
    String where = ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?";
    String[] selectionArgs = new String[] { contactID };
    String sortOrder = null;
    Cursor result = managedQuery(uri, projection, where, selectionArgs, sortOrder);
    if (result.moveToFirst()) {
        String phone = result.getString(result.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        if (phone == null) {
            result.close();
            return null;
        }
        result.close();
        return phone;
    }
    result.close();
    return null;
}

该函数的调用方式:

ArrayList<Contact> resultContacts = new ArrayList<Contact>();
Cursor result = null;
Uri uri = ContactsContract.Data.CONTENT_URI;
String[] projection = new String[] {
        ContactsContract.Contacts._ID,
        ContactsContract.Contacts.DISPLAY_NAME,
        ContactsContract.CommonDataKinds.Event.CONTACT_ID,
        ContactsContract.CommonDataKinds.Event.START_DATE,
};
String where = ContactsContract.Data.MIMETYPE+" = ? AND "+ContactsContract.CommonDataKinds.Event.TYPE+" = "+ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY;
String[] selectionArgs = new String[] {ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE};
String sortOrder = null;
result = managedQuery(uri, projection, where, selectionArgs, sortOrder);
while (result.moveToNext()) {
    Long id = result.getLong(result.getColumnIndex(ContactsContract.Contacts._ID));
    String phone = getContactPhone(String.valueOf(id));
    ...
}
...

不幸的是,它不起作用。如果使用从“
ContactsContract.Contacts._ID”获得的值调用此函数,则会得到null。为什么会这样呢?怎么了?

编辑: 我曾经将Contacts._ID映射到CommonDataKinds.Phone.CONTACT_ID-
无效。但是现在我将Contacts.DISPLAY_NAME映射到CommonDataKinds.Phone.DISPLAY_NAME,它突然工作了-
很奇怪,不是吗?但是我想映射ID而不是显示名称。所以这个问题仍然是话题。这可能是由于这些表中的ID不同导致的吗?这不是为什么会有查找ID吗?


问题答案:

要在第一部分中获取联系人ID,您应该使用:

ContactsContract.Data.CONTACT_ID

代替:

ContactsContract.Contacts._ID

因此,预测应为:

String[] projection = new String[] {
         ContactsContract.Data.CONTACT_ID,
         ContactsContract.CommonDataKinds.Event.CONTACT_ID,
         ContactsContract.CommonDataKinds.Event.START_DATE,
 };

然后当然得到正确的行:

Long id = result.getLong(result.getColumnIndex(ContactsContract.Data.CONTACT_ID));


 类似资料:
  • 我正在我的Twilio沙盒中构建一个whatsapp聊天机器人。我已经通过了API,但我不知道如何检索一个人的电话号码(发件人的电话号码),假设这是可能的?原因是我想限制每个用户在给定时间段内可以执行的操作数量。 我不确定这是否有帮助,但当我发送请求时,我在ngrok上获得的信息

  • 在我的网页移动视图中,我可以垂直和水平滚动,但这总是从左上角开始。现在,我想使用window将视口设置为我的自定义位置。滚动到或类似的东西。窗滚动似乎只适用于桌面浏览器。 知道我怎么解决吗?

  • 问题内容: 我已经使用Spark建立了Word2Vec模型并将其另存为模型。现在,我想在另一个代码中将其用作脱机模型。我已经加载了模型,并用它来表示单词的向量(例如,Hello),并且效果很好。但是,我需要使用map在RDD中为许多单词调用它。 当我在地图函数中调用model.transform()时,它将引发以下错误: “似乎您正在尝试从广播引用SparkContext。”异常:您似乎正在尝试从

  • 问题内容: 我正在尝试根据给定的联系人电话号码检索联系人姓名。我做了一个可以在所有API版本中使用的函数,因为我无法使其在1.6版中运行,而且我也看不到问题所在,也许有人可以发现它? 请注意,我已经为字符串替换了API常量,因此没有过时的警告问题。 问题答案: 使用反射而不是比较sdk版本。

  • 问题内容: 我在某些网站上找到了此代码,并且效果很好。它验证电话号码是以下格式之一: (123)456-7890 或 123-456-7890 问题是我的客户(我不知道为什么,也许是客户的东西)想添加另一种格式,即连续十个数字,如下所示: 1234567890 。 我正在使用这个正则表达式, 如何添加它还可以验证另一种格式?我对正则表达式不好。 问题答案: 首先,您的格式验证器显然仅适用于NANP

  • 这是使用com.android.support:appcompat-v7:22.2.0 删除autoLink参数将不会发生冲突。 有办法解决吗?