Различные результаты при добавлении нового контакта на устройствах Google (Nexus 6, Pixel)
У меня странная проблема с Nexus 6 (Android 7.0), что при добавлении нового контакта через намерение Uri, как результат rawContacts, не выглядит как обычно.
Вот мое намерение:
public static Intent getNewContactIntent() {
Intent intent = new Intent(Intent.ACTION_INSERT, ContactsContract.Contacts.CONTENT_URI);
intent.putExtra("finishActivityOnSaveCompleted", true);
return intent;
}
Результат onActivityResult:
Uri contactUri = data.getData();
На устройстве Nexus 6 (Api 24):
Содержание://com.android.contacts/raw_contacts/1376
В то время как на других устройствах, включая Nexus 6 на эмуляторе:
Содержание://com.android.contacts/contacts/lookup/2883i3c5a4b238cc57aad/1376
Как добиться того же результата на всех устройствах Android, включая Google?
Дополнительная информация:
Это странное поведение можно воспроизвести и на Pixel (Android 8).
Данные, полученные с помощью URI (... / raw_contacts / 1376):
+-----------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+
| column | value |
+-----------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+
| sort_key | Maher1 |
| send_to_voicemail | 0 |
| pinned | 0 |
| display_name | Maher1 |
| metadata_dirty | 0 |
| phonebook_label_alt | M |
| phonebook_bucket | 13 |
| version | 7 |
| custom_ringtone | null |
| _id | 1376 |
| times_contacted | 0 |
| account_type_and_data_set | com.google |
| sync4 | null |
| dirty | 0 |
| sync2 | Rn48fTVSLi17ImA9XBZXEUUJQwI."" |
| contact_id | 1376 |
| raw_contact_is_user_profile | 0 |
| aggregation_mode | 0 |
| data_set | null |
| phonebook_label | M |
| account_type | com.google |
| sync3 | 2017-08-31T12:44:27.075Z |
| display_name_alt | Maher1 |
| phonetic_name | null |
| last_time_contacted | null |
| display_name_source | 40 |
| backup_id | 3c5a4b238cc57aad |
| phonebook_bucket_alt | 13 |
| sort_key_alt | Maher1 |
| starred | 0 |
| deleted | 0 |
| account_name | maher*********@gmail.com |
| sourceid | 3c5a4b238cc57aad |
| sync1 | https://www.google.com/m8/feeds/contacts/maher*********%40gmail.com/base2_property-android_linksto-gprofiles_highresphotos/3c5a4b238cc57aad |
| phonetic_name_style | 0 |
+-----------------------------+---------------------------------------------------------------------------------------------------------------------------------------------+
В то время как данные, которые могут быть получены с ожидаемым URI (... / contacts / lookup / 2883i3c5a4b238cc57aad / 1376):
+--------------------------------+-----------------------+
| column | value |
+--------------------------------+-----------------------+
| sort_key | Maher1 |
| photo_uri | null |
| send_to_voicemail | 0 |
| contact_status | null |
| contact_status_label | null |
| pinned | 0 |
| display_name | Maher1 |
| phonebook_label_alt | M |
| phonebook_bucket | 13 |
| contact_status_res_package | null |
| in_default_directory | 1 |
| photo_id | null |
| custom_ringtone | null |
| _id | 1376 |
| times_contacted | 0 |
| phonebook_label | M |
| lookup | 2883i3c5a4b238cc57aad |
| display_name_alt | Maher1 |
| phonetic_name | null |
| last_time_contacted | 0 |
| contact_last_updated_timestamp | 1504183466085 |
| has_phone_number | 0 |
| in_visible_group | 1 |
| photo_file_id | null |
| display_name_source | 40 |
| is_user_profile | 0 |
| contact_status_ts | null |
| sort_key_alt | Maher1 |
| phonebook_bucket_alt | 13 |
| contact_presence | null |
| starred | 0 |
| photo_thumb_uri | null |
| contact_status_icon | null |
| contact_chat_capability | null |
| name_raw_contact_id | 1376 |
| phonetic_name_style | 0 |
+--------------------------------+-----------------------+
1 ответ
Лучшее решение, которое я нашел:
public static Uri getLookupURI(Intent data, ContentResolver resolver) {
Uri contactData = data.getData();
if (isRawContactsUri(contactData)) {
contactData = ContactsContract.RawContacts.getContactLookupUri(resolver, contactData);
}
return contactData;
}
public static boolean isRawContactsUri(Uri contactUri) {
return null != contactUri.getPathSegments() && !contactUri.getPathSegments().isEmpty() && "raw_contacts".equals(contactUri.getPathSegments().get(0));
}
Проверяет, имеет ли результат URI с rawContacts, затем извлекает LookupUri.