Более надежный способ добавлять и изменять контакты на Android
Время на чтение: 6 минут
Что произойдет с классической версией Аналитики
Приложения, предназначенные для предстоящего выпуска Android, больше не смогут напрямую записывать данные в контакты с разрешением WRITE_CONTACTS. Вместо этого можно использовать стандартные интенты для контактов (ACTION_INSERT, ACTION_EDIT и ACTION_INSERT_OR_EDIT). Полный пример реализации приведен в руководстве для разработчиков по изменению контактов с помощью намерений.
На устройствах с предстоящим выпуском Android эти три намерения будут работать одинаково и не потребуют никаких разрешений. Если ваше приложение предназначено для предстоящего выпуска Android или более поздней версии и пытается напрямую записывать данные в контакты, эти записи будут отклонены и приведут к ошибке SecurityException или отказу в разрешении. Для небольшого числа приложений, которым требуется широкий доступ для создания и изменения контактов, в Android 17 QPR2 (IV квартал 2026 г.) появится новое специальное разрешение MANAGE_CONTACTS. Сегодня Google Play публикует обновленные правила доступа к контактам, в том числе MANAGE_CONTACTS.
Зачем нужны изменения
Сейчас, если приложению нужно сохранить хотя бы один контакт, вы можете запрашивать разрешение WRITE_CONTACTS. Однако это разрешение предоставляет широкий доступ, позволяя приложению вносить масштабные изменения в контакты на устройстве в фоновом режиме, даже без взаимодействия с пользователем. Большинству приложений не требуется такое широкое разрешение.
Хотя альтернативы существуют, вы сообщили нам, что они должны быть более стандартизированы в экосистеме. Раньше намерения, связанные с контактами, обрабатывались по-разному на разных устройствах. Некоторые редакторы удаляли переданные вами данные, например фото контакта. На некоторых устройствах кнопка "Назад" сохраняла контакт без ведома пользователя, а функцию "Создать контакт" было трудно найти. Поэтому спросить разрешения было рациональным выбором. Мы устраняем все эти проблемы в следующей версии Android и требуем, чтобы устройства, на которых она работает, соответствовали тем же стандартам.
Что использовать вместо этого
Добавление или изменение контакта: использование намерений
Когда вы используете эти интенты (ACTION_INSERT, ACTION_EDIT и ACTION_INSERT_OR_EDIT), система берет на себя основную работу, предоставляя понятный и стандартизированный интерфейс редактора контактов. Откроется форма, в которой можно создать новую запись или найти существующий контакт и добавить в него информацию. Пользователи могут развернуть его в полностраничный редактор, чтобы указать больше сведений. При этом вашему приложению не потребуются разрешения на запись. Ниже приведены предварительные макеты UX.
Рисунок 1.Создание контакта. Интерфейс может измениться.
Рисунок 2.Добавление информации в существующий контакт. *Интерфейс в разработке*
Примечание. Производители устройств могут изменять интерфейс в соответствии со стилем ОС, но поведение останется прежним.
Вы можете дополнительно упростить процесс создания, передав вместе с намерением необязательные полезные данные, известные как Extras:
EXTRA_ACCOUNTпредлагает аккаунт, в котором будет сохранен контакт. Это полезно, если приложение синхронизирует контакты. Это дополнение уже существовало, но поддерживалось не на всех устройствах. Начиная со следующего выпуска Android, поддержка будет стандартизирована для всех устройств.EXTRA_PHOTO_URIпередает фотографию, чтобы заранее загрузить данные для фото контакта. Редактор обрабатывает разрешение на чтение URI. Это новая функция, которая появится в следующем выпуске Android и будет поддерживаться во всей экосистеме.
Раньше: запись напрямую с помощью
// Requires android.permission.WRITE_CONTACTS fun saveContactDirectly(context: Context, name: String, phone: String, account: Account) { val ops = arrayListOf( ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, account.type) .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, account.name) .build(), ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValue( ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE ) .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name) .build(), ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) .withValue( ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE ) .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone) .build() ) context.contentResolver.applyBatch(ContactsContract.AUTHORITY, ops) }
| После: открывается редактор контактов (разрешение не требуется).
fun saveContactWithEditor( context: Context, name: String, phone: String, account: Account, photoUri: Uri ) { val intent = Intent(Intent.ACTION_INSERT, ContactsContract.Contacts.CONTENT_URI).apply { putExtra(ContactsContract.Intents.Insert.NAME, name) putExtra(ContactsContract.Intents.Insert.PHONE, phone) // Suggest which account the contact is saved to putExtra(ContactsContract.Intents.Insert.EXTRA_ACCOUNT, account) // New in the upcoming Android release: pre-fill the contact photo putExtra(ContactsContract.Intents.Insert.EXTRA_PHOTO_URI, photoUri) clipData = ClipData.newRawUri("", photoUri) addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) } context.startActivity(intent) }
|
Раньше: обновление существующего контакта напрямую
// Requires android.permission.WRITE_CONTACTS fun addPhoneDirectly(context: Context, rawContactId: Long, phone: String) { val values = ContentValues().apply { put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId) put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone) } context.contentResolver.insert(ContactsContract.Data.CONTENT_URI, values) } | После: пользователь может выбрать контакт, который нужно обновить, или создать новый fun addPhoneWithEditor(context: Context, phone: String) { val intent = Intent(Intent.ACTION_INSERT_OR_EDIT).apply { type = ContactsContract.Contacts.CONTENT_ITEM_TYPE putExtra(ContactsContract.Intents.Insert.PHONE, phone) } context.startActivity(intent) } Если вы уже знаете, какой контакт нужно обновить, используйте fun editKnownContact(context: Context, contactUri: Uri, phone: String) { val intent = Intent(Intent.ACTION_EDIT, contactUri).apply { putExtra(ContactsContract.Intents.Insert.PHONE, phone) } context.startActivity(intent) }
|
Как выбрать контакт с помощью инструмента выбора контактов
Если вам нужно только читать контакты, выбранные пользователем, используйте инструмент выбора контактов, доступный начиная с Android 17. Разрешение не требуется.
Приложения для звонков и мессенджеры: используйте каталог пользователей
Некоторые приложения добавляют в контакты действия "Позвонить через…" или "Написать через…", чтобы пользователи могли начать звонок или чат из приложения "Телефон" или приложения "Контакты". Если ваше приложение делает это, добавляя дополнительные записи в контакты пользователя, перейдите на Каталог контактов, который появится в Android QPR2 (четвертый квартал 2026 года). Это новый системный каталог, в котором ваше приложение публикует информацию о том, как пользователи могут связаться друг с другом в вашем приложении, не редактируя контакты пользователя.
Примеры перехода приложений
Чтобы показать, как эти альтернативы работают на практике, мы подготовили несколько примеров того, как разные типы приложений могут запрашивать доступ к контактам.
| Примеры типов приложений (неполный список). | Рекомендуемый способ переноса |
| Социальные сети, одноранговые платежи и агрегаторы такси | Если в вашем приложении можно находить друзей, делить счет или делиться статусом поездки, вам не нужно запрашивать разрешение на доступ к контактам. Используйте инструмент выбора контактов для однократного выбора контакта и запускайте ACTION_INSERT с EXTRA_PHOTO_URI, когда пользователь нажимает "Сохранить в контактах" в профиле. |
| Сканеры визитных карточек и приложения для нетворкинга | Если ваше приложение сканирует бейдж или QR-код и сохраняет новый контакт или добавляет рабочий номер телефона к существующей записи коллеги, используйте ACTION_INSERT или ACTION_INSERT_OR_EDIT. Стандартизированный редактор на пол-экрана заранее загружает данные в проанализированные поля (имя, компания, телефон, адрес электронной почты и фото), чтобы пользователь мог проверить и сохранить их одним нажатием, не предоставляя разрешений на работу в фоновом режиме. |
| Приложения для звонков и мессенджеры по VoIP | Вместо того чтобы запрашивать у WRITE_CONTACTS добавление строк "Позвонить с помощью…" или "Отправить сообщение с помощью…" в адресную книгу пользователя, опубликуйте метаданные доступности в каталоге пользователей и используйте ACTION_INSERT, когда пользователи добавляют новый контакт из чата. |
| Enterprise CRM & Cloud Sync Apps | Если ваше приложение выполняет непрерывную двустороннюю фоновую синхронизацию контактов с облачным или корпоративным аккаунтом, при которой невозможно показывать пользователю интерфейс намерения для каждой записи, вы можете заявить разрешение MANAGE_CONTACTS . |
Что нужно проверить
- Специальные типы данных в редакторе не поддерживаются. Если вы передадите строки
Insert.DATAс MIME-типами, отличными от стандартных типовContactsContract.CommonDataKinds, эти MIME-типы будут проигнорированы редактором. SHOW_OR_CREATE_CONTACTне обрабатывается системным редактором. Предустановленное приложение "Контакты" по-прежнему может обрабатывать это действие. Чтобы обеспечить единообразное поведение на разных устройствах, используйтеACTION_INSERT_OR_EDIT.- По умолчанию запись не выполняется. Если вы выберете в качестве целевой версии предстоящий выпуск Android, любая прямая запись без
MANAGE_CONTACTSприведет кSecurityException or permission denial. Проверьте это.
Нужно ли мне использовать MANAGE_CONTACTS?
Вряд ли. Если ваше приложение сохраняет или редактирует контакты по запросу пользователя, то указанные выше намерения позволяют делать это без разрешения и декларации в Play Console.
MANAGE_CONTACTS – для приложений, основное назначение которых – управление контактами, когда интентов недостаточно. Пример:
| Ваше приложение… | Нужен MANAGE_CONTACTS? |
| Сохраняет контакт из чата, визитной карточки или заказа. | Нет, используйте ACTION_INSERT |
| Добавляет номер или адрес электронной почты к существующему контакту. | Нет. Используйте ACTION_INSERT_OR_EDIT или ACTION_EDIT. |
| Позволяет пользователям выбирать контакты, чтобы приглашать их, делиться с ними контентом или отправлять им платежи. | Нет. Используйте инструмент выбора контактов. |
| Добавляет действия для звонков и сообщений в контакты. | Нет, использовать каталог пользователей |
| Имеет собственный брендированный экран редактирования контактов. | Нет, только специального интерфейса недостаточно. |
| Это специализированное приложение для управления контактами или замены номеронабирателя. | Скорее да |
| Приложение для определения номеров и защиты от спама, которое массово обновляет записи в адресной книге. | Скорее да |
| Синхронизирует контакты с корпоративным или облачным аккаунтом в фоновом режиме. | Скорее да |
| Выполняет массовое резервное копирование и восстановление контактов или перенос данных с одного телефона на другой. | Скорее да |
| Задает рингтоны для отдельных контактов. | Скорее да |
Принципы работы
MANAGE_CONTACTS– это специальное разрешение для приложений. Это не диалоговое окно среды выполнения. Пользователи могут включить его в разделе Настройки > Специальный доступ для приложений > Управление контактами.
// Opens Settings > Apps > Special app access > Manage contacts val intent = Intent(Settings.ACTION_MANAGE_CONTACTS, Uri.fromParts("package", packageName, null)) context.startActivity(intent)
- Она позволяет читать, добавлять, изменять и удалять контакты, аккаунты и данные каталога пользователей. Запрашивать разрешение
READ_CONTACTSне нужно. - Чтобы опубликовать в Google Play приложение с разрешением
MANAGE_CONTACTS, отправьте в Play Console декларацию, в которой объясняется, почему намерений недостаточно для работы основных функций.
Этапы перехода
- Найдите записи контактов. Найдите в коде
WRITE_CONTACTS,ContactsContract.RawContacts.CONTENT_URI,ContactsContract.Data.CONTENT_URIиapplyBatch(ContactsContract.AUTHORITY, …). - Замените каждую запись, инициированную пользователем, намерением:
ACTION_INSERTдля новых контактов иACTION_EDITилиACTION_INSERT_OR_EDITдля обновлений. - Используйте только стандартные типы данных в
Insert.DATA. Переместите действия, связанные со звонками и сообщениями, в каталог пользователей. - Решите, действительно ли вам нужен
MANAGE_CONTACTS, используя таблицу выше. Если да, запланируйте заполнение декларации в Play Console. - Удалите
WRITE_CONTACTSиз манифеста, когда это разрешение больше не будет требоваться ни для одного пути выполнения.
Хронология
| Дата и время | Что произойдет |
| 21 октября 2026 г. | Google Play объявляет о правилах в отношении MANAGE_CONTACTS |
| 2026 (Android 17 Quarterly Platform Release 2) | Разрешение MANAGE_CONTACTS становится доступным |
| 2027 (предстоящий выпуск Android) | Разрешение WRITE_CONTACTS больше не предоставляет доступ на запись приложениям, предназначенным для предстоящего выпуска Android. Намерения, связанные с контактами, стандартизированы для всех устройств. |
| 2027 год, не ранее следующего выпуска Android | В Play Console разработчикам приложений, использующих разрешение MANAGE_CONTACTS, предлагается заполнить декларацию |
| 2027 год, не ранее следующего выпуска Android | Необходимо соблюдать правила Google Play |
Часто задаваемые вопросы
- Это касается всех приложений?
- Прекращение поддержки
WRITE_CONTACTSзатронет только приложения, предназначенные для следующей версии Android и более поздних. Приложения, предназначенные для более ранних версий, сохранят текущее поведение, однако новый стандартизированный редактор контактов будет доступен для всех приложений, работающих на новой ОС, независимо от их целевого SDK.
- Прекращение поддержки
- Может ли мое приложение удалять контакты с помощью намерения?
- Нет. Намерение удалить контакты отсутствует. Пользователи удаляют контакты в приложении "Контакты". Приложения с разрешением
MANAGE_CONTACTSмогут удалять контакты напрямую.
- Нет. Намерение удалить контакты отсутствует. Пользователи удаляют контакты в приложении "Контакты". Приложения с разрешением
- У меня уже есть собственный экран редактирования контактов. Можно ли ее сохранить?
- Только если ваше приложение соответствует требованиям
MANAGE_CONTACTS. Желание сохранить собственный дизайн не является достаточным основанием.
- Только если ваше приложение соответствует требованиям
- Заменяет ли
MANAGE_CONTACTSразрешение READ_CONTACTS?- Разрешение
MANAGE_CONTACTSвключает доступ на чтение, поэтому запрашивать оба разрешения не нужно. Однако многим приложениям, которые соответствуют требованиям для получения разрешенияREAD_CONTACTS, не нужно изменять контакты. Эти приложения могут по-прежнему запрашиватьREAD_CONTACTS.
- Разрешение
- Что произойдет с пользователями более ранних версий Android?
- Намерения для контактов работают и в более ранних версиях, обрабатываемых приложением "Контакты" на устройстве. Большинство приложений будут хорошо работать на всех устройствах, использующих эти намерения. Если в вашем приложении есть проблема с согласованностью, которая решена только в последних версиях, вы можете оставить разрешение
WRITE_CONTACTSв манифесте, указав подходящее значение maxSdkVersion.
- Намерения для контактов работают и в более ранних версиях, обрабатываемых приложением "Контакты" на устройстве. Большинство приложений будут хорошо работать на всех устройствах, использующих эти намерения. Если в вашем приложении есть проблема с согласованностью, которая решена только в последних версиях, вы можете оставить разрешение
-
Новости о продуктахНа конференции Google I/O 2026 мы объявили, что Android превращается из операционной системы в интеллектуальную. Мы также показали, как создавать интеллектуальные функции на основе системы и использовать возможности ИИ от Google в своих приложениях.
Jingyu Shi • Время на чтение: 2 минуты -
Новости о продуктахВ этом году на Google I/O мы не просто представим очередные обновления, а расскажем о фундаментальных изменениях в разработке приложений. Наши новейшие инструменты созданы для эпохи агентного ИИ. Они повышают продуктивность разработчиков Android и расширяют возможности ИИ-агентов, которых вы развертываете в своей базе кода.
Matthew Warner • Чтение займет 8 минут -
Новости о продуктахКак было объявлено сегодня на мероприятии The Android Show, Android превращается из операционной системы в интеллектуальную. Это открывает новые возможности для взаимодействия с вашими приложениями.
Matthew McCullough • Время на чтение: 4 минуты
Получайте еженедельную рассылку с последними новостями о разработке для Android.