Внедрение блочных телефонных номеров

Поскольку телефония является таким открытым каналом связи — любой может звонить или отправлять текстовые сообщения на любой номер в любое время — пользователям 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 Open Source Project (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