【问题标题】:ContactsContract: update RawContact ignores display_nameContactsContract:更新 RawContact 忽略 display_name
【发布时间】:2017-03-19 14:44:52
【问题描述】:

当为RawContact 更新ContactsContract.Data StructuredName 行时,我的代码将DISPLAY_NAME 列设置为用户提供的值。它还使用用户提供的值更新第一个、中间、最后一个。

当从ContactsContract.Contacts 取回联系人DISPLAY_NAME 时,提供给RawContact 的显示名称将被忽略,相反,Android 根据StructuredName 名称部分制作了一个。

有没有办法告诉ContactsContract 使用提供的显示名称?

例如,考虑将以下内容写入StructuredName 行:

DISPLAY_NAME: F L
GIVEN_NAME: F
MIDDLE_NAME: X
LAST_NAME: L

在这种情况下,我希望聚合联系人显示名称为“F L”。但是,它将是“F X L”。

下面是编写 StructureName 行的代码,其中为每一列设置的值是成员变量:

protected void prepareUpdate (ArrayList<ContentProviderOperation> ops)
{
  String where = ContactsContract.Data._ID + " = " + dataId;

  ContentProviderOperation.Builder builder;
  builder = ContentProviderOperation.newUpdate (ContactsContract.Data.CONTENT_URI);
  builder.withSelection (where, null);
  builder.withValue (ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
  builder.withValue (ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName);
  builder.withValue (ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, givenName);
  builder.withValue (ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, familyName);
  builder.withValue (ContactsContract.CommonDataKinds.StructuredName.PREFIX, prefix);
  builder.withValue (ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME, middleName);
  builder.withValue (ContactsContract.CommonDataKinds.StructuredName.SUFFIX, suffix);
  builder.withValue (ContactsContract.CommonDataKinds.StructuredName.PHONETIC_FAMILY_NAME, phoneticFamilyName);
  builder.withValue (ContactsContract.CommonDataKinds.StructuredName.PHONETIC_MIDDLE_NAME, phoneticMiddleName);
  builder.withValue (ContactsContract.CommonDataKinds.StructuredName.PHONETIC_GIVEN_NAME, phoneticGivenName);

  ops.add (builder.build());
}

这是执行“操作”的代码:

  ContentResolver resolver = context.getContentResolver();
  ContentProviderResult[] results = resolver.applyBatch(ContactsContract.AUTHORITY, ops);

下面是获取聚合联系人显示名称的代码:

public static ContactData fetchContact (Cursor cursor)
{
  String name = cursor.getString (cursor.getColumnIndex (ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));
  ... do something with the feteched data ...
}

如果 Android 忽略用户提供的显示名称,那么该列的意义何在?

【问题讨论】:

    标签: android contactscontract


    【解决方案1】:

    如果您查看 DISPLAY_NAME 的文档,它会说:

    应用于显示联系人的名称。非结构化 名称的组成部分应与其结构一致 代表

    这意味着每当您更新 DISPLAY_NAME 时,它都会更新名称部分(GIVEN_NAME 等),并且每当您更新其中一个部分时,它都会更新 DISPLAY_NAME,因此始终是名称部分和DISPLAY_NAME 是一致的。

    我猜他们这样做是为了避免这样的问题,例如用户将错误的名称设置为从“John Doe”到“Bob Dylan”的电话号码,但名称部分没有更新,所以它们仍然存在使用“John”和“Doe”,这显然是一个不受欢迎的情况。

    【讨论】:

    • 谢谢,但这是主观的。 “一致”是什么意思?不一致的后果是什么?他们也不解释。此外,我的应用程序成功地保存了用户在结构化名称部分或显示名称中输入的任何值。这个级别没有问题。问题是聚合级别使用名称部分而不是显示名称来确定聚合显示名称。
    • 您可以尝试一下,尝试只更新名称部分,看看 display_name 会发生什么,反之亦然...我同意这是主观的,但这完全取决于 ContactsContract 代码的方式是写出来的,所以至少它应该是确定性的。
    • 只是另一个小提示 - 看看 Google 的联系人编辑器是如何工作的 - 您可以编辑 display_name,或者单击展开按钮并仅编辑名称部分,它不允许您同时编辑两者
    • 是的,我知道这一点。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多