Как заблокировать номер телефона

Поскольку телефония – это открытый канал связи, по которому любой человек может позвонить или написать на любой номер в любое время, пользователям 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 API
    • Intent createManageBlockedNumbersIntent()
  • Carrier Config
    • KEY_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)

Пользовательский интерфейс

Пользовательский интерфейс 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 root
adb shell content query --uri content://com.android.blockednumber/blocked
adb 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