因為電話是一種開放的通信渠道——任何人都可以隨時撥打或發短信給任何號碼——Android 用戶需要能夠輕鬆阻止不需要的電話和短信。
在 N 之前,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:
-
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 用戶界面可以按原樣使用。設備實現者也可以實現他們自己的 UI 版本,只要它滿足相關的 CDD 要求。
請注意,使用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