Поскольку телефония – это открытый канал связи, по которому любой человек может позвонить или написать на любой номер в любое время, пользователям Android нужна возможность легко блокировать нежелательные звонки и сообщения.
До версии Android 7.0 пользователи могли блокировать звонки и текстовые сообщения с нежелательных номеров только с помощью скачанных приложений. Многие из этих приложений работают не так, как нужно, или не обеспечивают желаемый уровень удобства, поскольку в них нет подходящих API для блокировки звонков и сообщений.
Некоторые производители могут поставлять свои решения для блокировки в комплекте с устройствами, но если пользователь перейдет на другое устройство, список заблокированных номеров может быть утерян из-за отсутствия совместимости. Наконец, даже если пользователи используют приложения для звонков и клиенты обмена сообщениями, в которых есть такая функция, им, скорее всего, придется заблокировать номер в каждом приложении, чтобы блокировка действовала и для звонков, и для обмена текстовыми сообщениями.
Функции
В Android 7.0 появился поставщик контента BlockedNumberProvider, который хранит список номеров телефонов, заблокированных пользователем для звонков, SMS и MMS. Система будет блокировать звонки и текстовые сообщения с номеров, указанных в списке заблокированных. В Android 7.0 показывается список заблокированных номеров, и пользователь может добавлять и удалять номера.
Кроме того, функция блокировки номеров позволяет системе и приложениям на платформе работать вместе, чтобы защитить пользователя и упростить его взаимодействие с устройством. Приложение для звонков по умолчанию, клиент для обмена сообщениями по умолчанию, приложение с привилегиями UICC и приложения с той же подписью, что и у системы, могут напрямую считывать и записывать данные в черный список. Поскольку заблокированные номера хранятся в системе, они будут заблокированы независимо от того, какие приложения для звонков и мессенджеры использует пользователь. Наконец, черный список номеров можно восстановить на любом новом устройстве, независимо от производителя.
- У пользователя будет встроенная функция блокировки, которая не требует настройки и не теряет список заблокированных номеров при переходе в другое приложение или смене телефона. Все подходящие приложения в системе могут использовать один и тот же список, чтобы обеспечить пользователю максимально удобную работу.
- Разработчикам приложений не нужно создавать собственные инструменты для управления черным списком и входящими звонками и сообщениями. Они могут просто использовать функцию, предоставляемую платформой.
- Приложения для звонков и обмена сообщениями, выбранные пользователем в качестве приложений по умолчанию, могут читать данные из поставщика и записывать их в него. Другие приложения могут запускать пользовательский интерфейс управления черным списком с помощью
createManageBlockedNumbersIntent(). - Производители устройств могут использовать встроенную функцию платформы, чтобы блокировка была доступна сразу после покупки. Производители оригинального оборудования могут быть уверены, что при переходе с устройства другого производителя пользователи получат более удобный интерфейс ознакомления, поскольку черный список будет перенесен.
- Если у оператора есть собственное приложение для звонков или обмена сообщениями, он может использовать функцию платформы, чтобы разрешить пользователю вести черный список. Они могут быть уверены, что список заблокированных пользователей останется с ними, даже если они получат новое устройство. Наконец, все приложения с привилегиями оператора могут читать черный список, поэтому, если оператор хочет предоставить пользователю дополнительную более мощную блокировку на основе черного списка, теперь это возможно с помощью этой функции.
Поток данных
Рисунок 1. Как заблокировать поток данных номеров телефонов
Примеры и источник
Вот примеры вызовов с использованием новой функции блокировки номеров:
Запустить менеджер заблокированных номеров из приложения
Context.startActivity(telecomManager.createManageBlockedNumbersIntent(), null);
Запрос заблокированных номеров
Cursor c = getContentResolver().query(BlockedNumbers.CONTENT_URI,
new String[]{BlockedNumbers.COLUMN_ID,
BlockedNumbers.COLUMN_ORIGINAL_NUMBER,
BlockedNumbers.COLUMN_E164_NUMBER}, null, null, null);Укажите заблокированный номер
ContentValues values = new ContentValues(); values.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "1234567890"); Uri uri = getContentResolver().insert(BlockedNumbers.CONTENT_URI, values);
Как удалить заблокированный номер
ContentValues values = new ContentValues(); values.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "1234567890"); Uri uri = getContentResolver().insert(BlockedNumbers.CONTENT_URI, values); getContentResolver().delete(uri, null, null);
Реализация
Чтобы использовать функцию блокировки номеров, необходимо выполнить следующие основные задачи:
- Производители оригинального оборудования реализуют функции ограничения звонков и сообщений на своих устройствах с помощью
BlockedNumberProvider - Если у оператора есть приложение для звонков или обмена сообщениями, реализуйте функции ограничения звонков и сообщений с помощью
BlockedNumberProvider. - Поставщики сторонних приложений для звонков и обмена сообщениями используют
BlockedNumberProviderдля блокировки.
Рекомендации для OEM
Если на устройстве ранее не было дополнительных функций ограничения звонков и сообщений, используйте функцию блокировки номеров в проекте Android Open Source Project (AOSP) на всех таких устройствах. Рекомендуется поддерживать удобные точки входа для блокировки, например блокировку номера прямо из списка вызовов или в цепочке сообщений.
Если на устройстве ранее были функции ограничения звонков и сообщений, адаптируйте их так, чтобы все номера телефонов с точным совпадением, которые заблокированы, хранились в BlockedNumberProvider,, а поведение в отношении поставщика услуг связи соответствовало требованиям к этой функции, изложенным в документе CDD.
Другие продвинутые функции можно реализовать с помощью специальных поставщиков и пользовательских элементов управления интерфейса, если при этом соблюдаются требования CDD в отношении блокировки номеров телефонов с точным соответствием. Рекомендуем помечать другие функции как "расширенные", чтобы не путать их с базовой функцией блокировки номеров.
API
Вот какие API используются:
TelecomManager APIIntent createManageBlockedNumbersIntent()
Carrier ConfigKEY_DURATION_BLOCKING_DISABLED_AFTER_EMERGENCY_INT
- Ознакомьтесь с
BlockedNumberContract.- API, предоставленные
BlockedNumberContract boolean isBlocked(Context context, String phoneNumber)int unblock(Context context, String phoneNumber)boolean canCurrentUserBlockNumbers(Context context)
- API, предоставленные
Пользовательский интерфейс
Пользовательский интерфейс BlockedNumbersActivity.java, предоставляемый в AOSP, можно использовать без изменений. Производители устройств также могут реализовать собственную версию интерфейса, если она соответствует требованиям CDD.
Обратите внимание, что для восстановления черного списка с помощью BlockedNumberProvider может потребоваться приложение партнера для ПК, предназначенное для резервного копирования и восстановления. На изображениях ниже показан интерфейс заблокированных номеров, поставляемый в AOSP.
Рисунок 2. Пользовательский интерфейс блокировки номеров телефонов
Проверка
Чтобы убедиться, что реализованная вами версия функции работает правильно, запустите следующие тесты CTS:
android.provider.cts.BlockedNumberContractTest com.android.cts.numberblocking.hostside.NumberBlockingTest android.telecom.cts.ExtendedInCallServiceTest#testIncomingCallFromBlockedNumber_IsRejected android.telephony.cts.SmsManagerTest#testSmsBlocking
Параметром BlockedNumberProvider можно управлять с помощью команд adb после запуска $ adb root. Пример:
adb rootadb shell content query --uri content://com.android.blockednumber/blockedadb shell content insert --uri / content://com.android.blockednumber/blocked --bind / original_number:s:'6501002000'adb shell content delete --uri / content://com.android.blockednumber/blocked/1