Как открыть контактную карточку в Android по ID

Можно ли открыть карточку контакта Android с помощью ID контакта? Он работает с номером телефона. Вот пример, если я использую

Intent i = new Intent();
i.setAction(ContactsContract.Intents.SHOW_OR_CREATE_CONTACT);
i.setData(Uri.fromParts("tel", "123456", null)); //<---- Change here from Phone to IDcontext.startActivity(i);

Но я хочу открыть эту карточку контакта по ID, например, если номер телефона из контакта изменится.

Ответы

Ответ 1

используйте ACTION_VIEW и создайте URI контакта, используя идентификатор контакта, или используйте URI для поиска контактов, если у вас уже есть (предпочтительнее).

    Intent intent = new Intent(Intent.ACTION_VIEW);
    Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(contactID));
    intent.setData(uri);
context.startActivity(intent);

Ответ 2

Вы использовали бы следующий URI:

Uri.Builder newUriBuilder = ContactsContract.Contacts.CONTENT_LOOKUP_URI.buildUpon();
newUriBuilder.appendPath("/").appendPath(theContactKey)
i.setData(newUriBuilder.build());

Более подробную информацию о том, как работает этот URI, можно найти в документации API для CONTENT_LOOKUP_URI.

Ответ 3

Я пытался открыть карточку контакта, используя перечисленные здесь методы, но каким-то образом активность контактов закрывалась сразу же после ее открытия.

казалось, что контактная активность не приняла мой старый контент uri.

Я решил эту проблему, используя метод getLookupUri (long contactId, String lookupKey) класса ContactsContract.Contacts для получения правильного содержимого uri https://developer.android.com/reference/android/provider/ContactsContract.Contacts.html#getLookupUri(long, java.lang.String)

Таким образом, код открытия карточки контакта становится:

Intent intent = new Intent(Intent.ACTION_VIEW);
String lookupKey = phonesCursor.getString(phonesCursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup.LOOKUP_KEY));
long contactId = phonesCursor.getLong(phonesCursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup._ID));
Uri uri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey);
intent.setData(uri);
startActivity(intent);