สกรีนสายเรียกเข้า

อุปกรณ์ที่ใช้ 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 ในไฟล์ Manifest ที่มีตัวกรอง Intent และสิทธิ์ที่เหมาะสมเพื่อให้ระบบทริกเกอร์ได้ ได้อย่างถูกต้อง

<service
    android:name=".ScreeningService"
    android:permission="android.permission.BIND_SCREENING_SERVICE">
    <intent-filter>
        <action android:name="android.telecom.CallScreeningService" />
    </intent-filter>
</service>