Реализация блокировки телефонных номеров

Поскольку телефония является открытым каналом связи (кто угодно может позвонить или отправить сообщение на любой номер в любое время), пользователям Android нужна возможность легко блокировать нежелательные звонки и текстовые сообщения.

До появления N пользователям Android приходилось полагаться на загруженные приложения, чтобы ограничить звонки и текстовые сообщения с назойливых телефонных номеров. Многие из этих приложений либо не работают должным образом, либо предоставляют не совсем идеальные возможности, поскольку не существует подходящих API-интерфейсов для блокировки вызовов и сообщений.

Некоторые производители могут поставлять свои собственные готовые решения для блокировки, но если пользователи переключают устройства, они могут полностью потерять список заблокированных устройств из-за отсутствия совместимости. Наконец, даже если пользователи используют приложения для набора номера и клиенты обмена сообщениями, которые предоставляют такую ​​​​функциональность, им, вероятно, все равно придется выполнить действие блокировки в каждом приложении, чтобы блокировка вступила в силу как для звонков, так и для текстовых сообщений.

Функции

В выпуске Android 7.0 представлен поставщик контента BlockedNumberProvider , который хранит список телефонных номеров, которые пользователь указал, с которыми нельзя связаться с помощью телефонной связи (вызовы, SMS, MMS). Система будет учитывать номера в заблокированном списке, ограничивая звонки и текстовые сообщения с этих номеров. Android 7.0 отображает список заблокированных номеров и позволяет пользователю добавлять и удалять номера.

Кроме того, функция блокировки номеров позволяет системе и соответствующим приложениям на платформе работать вместе, чтобы защитить пользователя и упростить работу. Программа дозвона по умолчанию, клиент обмена сообщениями по умолчанию, приложение с привилегиями UICC и приложения с той же подписью, что и система, могут напрямую читать и записывать в список заблокированных пользователей. Поскольку заблокированные номера хранятся в системе, независимо от того, какие приложения для набора номера или обмена сообщениями использует пользователь, номера остаются заблокированными. Наконец, список заблокированных номеров можно восстановить на любом новом устройстве независимо от производителя.

  • Пользователь гарантированно получит функцию блокировки, которая работает «из коробки», и не потеряет свой черный список при переключении приложений или приобретении нового телефона. Все соответствующие приложения в системе могут использовать один и тот же список, чтобы предоставить пользователю наиболее удобный интерфейс.
  • Разработчикам приложений не нужно разрабатывать собственный способ управления списком блокировки, а также входящими вызовами и сообщениями. Они могут просто использовать функцию, предоставляемую платформой.
  • Приложения дозвона/мессенджера, выбранные пользователем по умолчанию, могут читать и записывать данные провайдера. Другие приложения могут запускать пользовательский интерфейс управления черным списком с помощью createManageBlockedNumbersIntent()
  • OEM-производители могут использовать функцию, предоставляемую платформой, для поставки функции блокировки «из коробки». OEM-производители могут быть уверены, что когда пользователи переключаются с устройства другого OEM-производителя, им будет удобнее регистрироваться, поскольку черный список также будет перенесен.
  • Если у оператора связи есть собственное приложение для набора номера или обмена сообщениями, он может повторно использовать функцию платформы, чтобы позволить пользователю вести черный список. Они могут быть уверены, что список заблокированных пользователей останется у пользователей, даже когда они получат новое устройство. Наконец, все приложения, привилегированные оператором связи, могут читать черный список, поэтому, если оператор связи хочет предоставить дополнительную, более мощную блокировку для пользователя на основе черного списка, это теперь возможно с помощью этой функции.

Поток данных

поток данных номеров блоков

Рисунок 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);

Выполнение

Вот задачи высокого уровня, которые необходимо выполнить, чтобы использовать функцию блокировки номеров:

  • OEM-производители реализуют функции ограничения вызовов/сообщений на своих устройствах с помощью BlockedNumberProvider .
  • Если у оператора есть приложение дозвона или обмена сообщениями, реализуйте функции ограничения вызовов/сообщений с помощью BlockedNumberProvider .
  • Сторонние поставщики приложений для дозвона и обмена сообщениями используют BlockedNumberProvider для своих функций блокировки.

Рекомендации для OEM-производителей

Если устройство ранее никогда не поставлялось с какими-либо дополнительными функциями ограничения вызовов/сообщений, используйте функцию блокировки номеров в проекте Android с открытым исходным кодом (AOSP) на всех таких устройствах. Рекомендуется поддерживать разумные точки входа для блокировки, например блокировку номера прямо из журнала вызовов или внутри цепочки сообщений.

Если устройство ранее поставлялось с функциями ограничения вызовов/сообщений, адаптируйте эти функции так, чтобы все заблокированные телефонные номера со строгим соответствием сохранялись в BlockedNumberProvider, а поведение вокруг провайдера соответствовало требованиям для этой функции, изложенным в разделе совместимости Android. Документ определения (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