전화번호 차단 구현

전화 통신은 누구나 어떤 번호로 언제든 전화하거나 문자를 보낼 수 있는 개방형 통신 채널이므로 Android 사용자는 원치 않는 전화와 문자를 쉽게 차단할 수 있는 방법을 필요로 합니다.

N 이전에는 Android 사용자가 원치 않는 전화와 문자를 제한하려면 앱을 다운로드해야 했습니다. 전화와 메시지를 차단하는 적절한 API가 없기 때문에 이러한 앱 대다수는 원하는 대로 작동하지 않거나 이상적인 환경을 제공하지 못합니다.

일부 기기 제조업체는 자체 차단 솔루션을 기본으로 제공하기도 하지만 사용자가 기기를 전환하면 기기 간 상호 운용성 부재로 차단 목록이 완전히 손실될 수 있습니다. 사용자가 이러한 기능을 제공하는 다이얼링 앱과 메시징 클라이언트를 사용하더라도 여전히 전화와 문자를 모두 차단하려면 각 앱에서 차단 작업을 실행해야 할 수 있습니다.

기능

Android 7.0 버전에는 전화 통신(통화, SMS, MMS)을 통해 연락할 수 없도록 사용자가 지정한 전화번호 목록을 저장하는 BlockedNumberProvider 콘텐츠 제공자가 도입되었습니다. 시스템에서 차단 목록에 있는 번호를 기반으로 해당 번호의 전화와 문자를 제한합니다. 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 요구사항이 충족되는 경우 맞춤 공급자 및 맞춤 UI/컨트롤을 통해 다른 고급 기능을 구현할 수 있습니다. 기본 번호 차단 기능과 혼동되지 않도록 다른 기능은 '고급' 기능으로 표시하는 것이 좋습니다.

API

사용되는 API는 다음과 같습니다.

  • TelecomManager API
    • Intent createManageBlockedNumbersIntent()
  • Carrier Config
    • KEY_DURATION_BLOCKING_DISABLED_AFTER_EMERGENCY_INT
  • BlockedNumberContract를 참조하세요.
    • BlockedNumberContract에서 제공하는 API
    • boolean isBlocked(Context context, String phoneNumber)
    • int unblock(Context context, String phoneNumber)
    • boolean canCurrentUserBlockNumbers(Context context)

사용자 인터페이스

AOSP에서 제공하는 BlockedNumbersActivity.java 사용자 인터페이스는 있는 그대로 사용할 수 있습니다. 기기 구현자는 관련된 CDD 요구사항을 충족한다면 자체 UI 버전도 구현할 수 있습니다.

BlockedNumberProvider를 사용하여 차단 목록 복원을 구현하려면 파트너의 백업 및 복원용 PC 애플리케이션이 필요할 수 있습니다. AOSP에서 제공하는 차단 번호 인터페이스는 아래 이미지를 참조하세요.

번호 차단 사용자 인터페이스

그림 2. 전화번호 차단 사용자 인터페이스

유효성 검사

구현자는 다음 CTS 테스트를 실행하여 기능 버전이 의도한 대로 작동하도록 할 수 있습니다.

android.provider.cts.BlockedNumberContractTest
com.android.cts.numberblocking.hostside.NumberBlockingTest
android.telecom.cts.ExtendedInCallServiceTest#testIncomingCallFromBlockedNumber_IsRejected
android.telephony.cts.SmsManagerTest#testSmsBlocking

$ adb root를 실행한 후 adb 명령을 사용하여 BlockedNumberProvider를 조작할 수 있습니다. 예를 들면 다음과 같습니다.

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