Hiện màn hình cuộc gọi

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>