電話番号のブロックの実装

電話機能はきわめてオープンな通信チャネルであり、誰でも随時、任意の番号へ電話をかける、またはテキストを送信することができます。そのため、Android ユーザーには不要な通話とテキストを簡単にブロックできる機能が必要です。

Android N より前では、ユーザーはダウンロードしたアプリを使用して、迷惑な番号からの通話やテキストを制限する必要がありました。こうしたアプリの多くは、通話やメッセージをブロックするための適切な 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 Compatibility Definition Document(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

BlockedNumberProvider は、$ adb root の実行後に adb コマンドを使用して変更できます。次に例を示します。

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