Thiết bị chạy Android 10 (API cấp 29) trở lên cho phép ứng dụng của bạn xác định
cuộc gọi từ các số không có trong sổ địa chỉ của người dùng có khả năng là làm phiền
cuộc gọi. Người dùng có thể chọn từ chối tự động các cuộc gọi làm phiền. Để cung cấp nhiều hơn
thông tin minh bạch cho người dùng khi họ bỏ lỡ cuộc gọi, thông tin về các cuộc gọi bị chặn
các cuộc gọi được ghi lại trong nhật ký cuộc gọi. Việc sử dụng API Android 10 sẽ loại bỏ
để có được
READ_CALL_LOG
quyền từ người dùng để cung cấp tính năng sàng lọc cuộc gọi và tên nhận dạng người gọi
của Google.
Bạn sử dụng
CallScreeningService
để sàng lọc cuộc gọi. Gọi
onScreenCall()
cho mọi cuộc gọi đến hoặc cuộc gọi đi mới khi số này không nằm trong
danh bạ của người dùng. Bạn có thể xem
Đối tượng Call.Details
cho thông tin
về cuộc gọi này. Cụ thể,
getCallerNumberVerificationStatus()
hàm này bao gồm thông tin từ nhà cung cấp mạng về số khác.
Nếu trạng thái xác minh không thành công, đây là một dấu hiệu tốt cho thấy cuộc gọi
từ một số điện thoại không hợp lệ hoặc từ một cuộc gọi có khả năng làm phiền.
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 } } } }
Đặt hàm onScreenCall()
để gọi
respondToCall()
để cho hệ thống biết cách phản hồi cuộc gọi mới. Hàm này nhận một
CallResponse
mà bạn có thể sử dụng để yêu cầu hệ thống chặn cuộc gọi, từ chối cuộc gọi như thể
người dùng đã thực hiện hoặc tắt tiếng. Bạn cũng có thể yêu cầu hệ thống bỏ qua việc thêm đoạn mã này
cuộc gọi đến nhật ký cuộc gọi của thiết bị.
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());
Bạn phải đăng ký phương thức triển khai CallScreeningService
trong tệp kê khai
có bộ lọc ý định và quyền thích hợp để hệ thống có thể kích hoạt
một cách chính xác.
<service
android:name=".ScreeningService"
android:permission="android.permission.BIND_SCREENING_SERVICE">
<intent-filter>
<action android:name="android.telecom.CallScreeningService" />
</intent-filter>
</service>