導入電話號碼封鎖功能

因為電話是公開的通訊管道,任何人都能 您可以隨時傳送簡訊到任何號碼,Android 使用者需要能 不請自來電話和簡訊

在 Android 7.0 以下版本中,Android 使用者必須透過下載的應用程式才能限制通話和 來自遠大電話號碼的簡訊。許多應用程式無法 或提供的體驗不理想,因為沒有合適的 API 以封鎖通話和訊息

部分製造商可能會立即自行提供封鎖解決方案,但 如果使用者切換裝置,可能會因為缺乏 實現互通性最後,即便使用者 提供這類功能的訊息用戶端, 在每個應用程式中執行區塊動作,封鎖設定就會同時生效 。

功能

Android 7.0 版本推出了 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 開放原始碼中的數字封鎖功能 所有這類裝置上的 Project (AOSP) 服務。建議輸入合理的值 支援封鎖點數,例如直接從通話中封鎖號碼 或是在訊息串內紀錄

如果裝置先前出貨時設有通話/訊息限制功能, 調整功能,禁止所有封鎖的嚴格相符電話號碼 儲存在 BlockedNumberProvider, 中,而行為 並符合這項功能的相關規定 Android 相容性定義說明文件 (CDD)。

透過自訂提供者和自訂 UI 導入任何其他進階功能 / 控制項,只要符合 CDD 要求 封鎖嚴格比對電話號碼我們建議其他功能 標示為「進階」功能,以免與基本功能混淆 使用一組電話號碼封鎖功能

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)

使用者介面

Android 開放原始碼計畫提供的 BlockNumbersActivity.java 使用者介面可以做為 不過,無論內部 IP 位址為何 DNS 名稱始終會指向特定的執行個體只要裝置實作人員也可以實作自己的 UI 版本,只要該 UI 符合相關的 CDD 要求。

請注意,您可能需要合作夥伴的電腦應用程式來備份及還原,才能使用 BlockedNumberProvider 實作封鎖清單還原作業。請參閱以下圖片,瞭解封鎖條件 所提供的數字介面。

區塊號碼使用者介面

圖 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