อุปกรณ์ที่ใช้ 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>