由於電話是開放式通訊管道,任何人都可以隨時撥打或傳送簡訊給任何號碼,因此 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 開放原始碼計畫 (AOSP) 中的電話號碼封鎖功能。建議您支援合理的封鎖條件,例如直接從通話記錄或訊息會話串中封鎖號碼。
如果裝置先前已提供通話/訊息限制功能,請調整這些功能,讓所有遭封鎖的完全相符的電話號碼都儲存在 BlockedNumberProvider,
中,且供應商的行為符合 Android 相容性定義文件 (CDD) 中列出的這項功能要求。
只要符合禁止嚴格比對電話號碼的 CDD 規定,您可以透過自訂供應器和自訂 UI/控制項實作任何其他進階功能。建議將這些其他功能標示為「進階」功能,以免與基本號碼封鎖功能混淆。
API
以下是使用的 API:
TelecomManager API
Intent createManageBlockedNumbersIntent()
Carrier Config
KEY_DURATION_BLOCKING_DISABLED_AFTER_EMERGENCY_INT
- 請參閱
BlockedNumberContract
BlockedNumberContract
提供的 APIboolean isBlocked(Context context, String phoneNumber)
int unblock(Context context, String phoneNumber)
boolean canCurrentUserBlockNumbers(Context context)
使用者介面
AOSP 提供的 BlockedNumbersActivity.java 使用者介面可直接使用。只要裝置導入者導入的 UI 版本符合相關 CDD 規定,也可以導入自己的 UI 版本。
請注意,您可能需要合作夥伴的電腦應用程式來備份及還原,才能使用 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
執行 $ 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