Android - 按展示名称查找联系人

Bja*_*sen 10 android android-contentresolver

我正在尝试通过显示名称找到联系人.目标是打开此联系人并向其添加更多数据(特别是更多的电话号码),但我很难找到我想要更新的联系人.

这是我正在使用的代码:

    public static String findContact(Context context) {

    ContentResolver contentResolver = context.getContentResolver();
    Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI;
    String[] projection = new String[] { PhoneLookup._ID };
    String selection = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " = ?";
    String[] selectionArguments = { "John Johnson" };
    Cursor cursor = contentResolver.query(uri, projection, selection, selectionArguments, null);

    if (cursor != null) {
        while (cursor.moveToNext()) {
            return cursor.getString(0);
        }
    }
    return "John Johnson not found";
}
Run Code Online (Sandbox Code Playgroud)

我确实有一个名为"John Johnson"的联系人,但该方法始终返回"未找到".我也尝试用一个名字搜索一个联系人,这没什么区别.

我怀疑它的东西,错误的URI,选择或选择论,因为我无法找到搜索与给定的显示名称接触的任何例子在线,似乎显示名称是一种特殊的信息,例如从不同一个电话号码.

任何想法如何找到约翰逊?


更新:我发现了如何通过显示名称找到联系人:

        ContentResolver contentResolver = context.getContentResolver();
    Uri uri = Data.CONTENT_URI;
    String[] projection = new String[] { PhoneLookup._ID };
    String selection = StructuredName.DISPLAY_NAME + " = ?";
    String[] selectionArguments = { "John Johnson" };
    Cursor cursor = contentResolver.query(uri, projection, selection, selectionArguments, null);

    if (cursor != null) {
        while (cursor.moveToNext()) {
            return cursor.getString(0);
        }
    }
    return "John Johnson not found";
Run Code Online (Sandbox Code Playgroud)

此代码返回显示名称为"John Johnson"的第一个联系人的联系人ID.在我的原始代码中,我的查询中包含错误的uri和错误的选择.

Jos*_*ter 0

更改您的查询 URI。

您使用的 URI 旨在仅过滤电话号码:

Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI;
Run Code Online (Sandbox Code Playgroud)

您需要使用有权访问该display_name列的 URI,如下所示:

Uri uri = ContactsContract.Data.CONTENT_URI;
Run Code Online (Sandbox Code Playgroud)

Android SDK 文档上对使用哪些 URI 以及何时使用它们进行了详细的细分:

  • 如果您需要读取单个联系人,请考虑使用 CONTENT_LOOKUP_URI 而不是 CONTENT_URI。

  • 如果您需要通过电话号码查找联系人,请使用 PhoneLookup.CONTENT_FILTER_URI,它已为此目的进行了优化。

  • 如果您需要按部分姓名查找联系人(例如,生成输入时过滤建议),请使用 CONTENT_FILTER_URI URI。

  • 如果您需要通过某些数据元素(例如电子邮件地址、昵称等)查找联系人,请对 ContactsContract.Data 表使用查询。结果将包含联系人 ID、姓名等。