實施阻止電話號碼

由於電話是一種開放的通訊管道 - 任何人都可以隨時撥打任何號碼或發送簡訊 - 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

執行$ 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