搭載 Android 10 (API 級別 29) 以上版本的裝置可讓應用程式識別
撥打不屬於使用者通訊錄的電話,可能是騷擾電話
呼叫。使用者可以選擇讓系統拒絕騷擾電話,為了提供
針對錯過來電的使用者提供公開透明的資訊;對於已封鎖的來電相關資訊
通話記錄。使用 Android 10 API 時,系統不會顯示
以便取得
READ_CALL_LOG
敬上
使用者授權,以便提供來電過濾和來電顯示功能
功能。
您使用
CallScreeningService
敬上
。在
onScreenCall()
敬上
功能。
使用者的聯絡人清單。如要查看
Call.Details
物件資訊
有關通話的內容具體而言,
getCallerNumberVerificationStatus()
敬上
函式包含網路供應商提供的另一個號碼相關資訊。
如果驗證狀態失敗,表示此呼叫:
。
Kotlin
class ScreeningService : CallScreeningService() { // This function is called when an ingoing or outgoing call // is from a number not in the user's contacts list override fun onScreenCall(callDetails: Call.Details) { // Can check the direction of the call val isIncoming = callDetails.callDirection == Call.Details.DIRECTION_INCOMING if (isIncoming) { // the handle (e.g. phone number) that the Call is currently connected to val handle: Uri = callDetails.handle // determine if you want to allow or reject the call when (callDetails.callerNumberVerificationStatus) { Connection.VERIFICATION_STATUS_FAILED -> { // Network verification failed, likely an invalid/spam call. } Connection.VERIFICATION_STATUS_PASSED -> { // Network verification passed, likely a valid call. } else -> { // Network could not perform verification. // This branch matches Connection.VERIFICATION_STATUS_NOT_VERIFIED. } } } } }
Java
class ScreeningService extends CallScreeningService { @Override public void onScreenCall(@NonNull Call.Details callDetails) { boolean isIncoming = callDetails.getCallDirection() == Call.Details.DIRECTION_INCOMING; if (isIncoming) { Uri handle = callDetails.getHandle(); switch (callDetails.getCallerNumberVerificationStatus()) { case Connection.VERIFICATION_STATUS_FAILED: // Network verification failed, likely an invalid/spam call. break; case Connection.VERIFICATION_STATUS_PASSED: // Network verification passed, likely a valid call. break; default: // Network could not perform verification. // This branch matches Connection.VERIFICATION_STATUS_NOT_VERIFIED } } } }
設定要呼叫的 onScreenCall()
函式
respondToCall()
通知系統如何回應新的呼叫這個函式採用
CallResponse
敬上
參數,可用來指示系統封鎖呼叫,就像
使用者手動操作或關閉通知。您也可以指示系統略過新增這個指令碼
自動打回裝置的通話記錄。
Kotlin
// Tell the system how to respond to the incoming call // and if it should notify the user of the call. val response = CallResponse.Builder() // Sets whether the incoming call should be blocked. .setDisallowCall(false) // Sets whether the incoming call should be rejected as if the user did so manually. .setRejectCall(false) // Sets whether ringing should be silenced for the incoming call. .setSilenceCall(false) // Sets whether the incoming call should not be displayed in the call log. .setSkipCallLog(false) // Sets whether a missed call notification should not be shown for the incoming call. .setSkipNotification(false) .build() // Call this function to provide your screening response. respondToCall(callDetails, response)
Java
// Tell the system how to respond to the incoming call // and if it should notify the user of the call. CallResponse.Builder response = new CallResponse.Builder(); // Sets whether the incoming call should be blocked. response.setDisallowCall(false); // Sets whether the incoming call should be rejected as if the user did so manually. response.setRejectCall(false); // Sets whether ringing should be silenced for the incoming call. response.setSilenceCall(false); // Sets whether the incoming call should not be displayed in the call log. response.setSkipCallLog(false); // Sets whether a missed call notification should not be shown for the incoming call. response.setSkipNotification(false); // Call this function to provide your screening response. respondToCall(callDetails, response.build());
您必須在資訊清單中註冊 CallScreeningService
實作項目
檔案含有適當意圖篩選器和權限,以利系統觸發
但事實並非如此
<service
android:name=".ScreeningService"
android:permission="android.permission.BIND_SCREENING_SERVICE">
<intent-filter>
<action android:name="android.telecom.CallScreeningService" />
</intent-filter>
</service>