在更新RawContact的ContactsContract.Data StructuredName行时,我的代码使用用户提供的值设置DISPLAY_NAME列。它还用用户提供的值更新第一、中间、最后的值。
当从ContactsContract.Contacts取回联系人DISPLAY_NAME时,提供给RawContact的显示名称被忽略,取而代之的是,安卓基于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());
}下面是执行“ops”的代码:
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忽略了用户提供的显示名称,那么该列的意义何在?
发布于 2017-03-20 18:42:00
如果你看一下DISPLAY_NAME的文档,它会说:
应用于显示联系人的名称。名称为的非结构化组件应与其结构化表示保持一致。
这意味着每当您更新DISPLAY_NAME时,它都会更新名称部分(GIVEN_NAME等),而每当您更新其中一个部分时,它就会更新DISPLAY_NAME,因此名称部分和DISPLAY_NAME始终是一致的。
我猜他们这样做是为了避免出现这样的问题,比如用户将错误的名称设置为电话号码,从"John Doe“到"Bob Dylan",但是名称部分没有更新,所以它们仍然使用"John”和"Doe",这显然是一种不受欢迎的情况。
https://stackoverflow.com/questions/42887911
复制相似问题