تماس های صفحه نمایش

دستگاه‌هایی که Android 10 (سطح API 29) یا بالاتر را اجرا می‌کنند به برنامه شما امکان می‌دهند تماس‌ها را از شماره‌هایی که در دفترچه آدرس کاربر نیستند به‌عنوان تماس‌های هرزنامه احتمالی شناسایی کند. کاربران می توانند انتخاب کنند که تماس های هرزنامه بی سر و صدا رد شود. برای ارائه شفافیت بیشتر به کاربران در هنگام از دست دادن تماس، اطلاعات مربوط به این تماس های مسدود شده در گزارش تماس ثبت می شود. استفاده از Android 10 API الزام به دریافت مجوز READ_CALL_LOG را از کاربر به منظور ارائه قابلیت غربالگری تماس و شناسه تماس گیرنده حذف می کند.

شما از اجرای CallScreeningService برای نمایش تماس ها استفاده می کنید. وقتی شماره در لیست مخاطبین کاربر نیست، تابع onScreenCall() را برای هر تماس ورودی یا خروجی جدید فراخوانی کنید. می‌توانید شی Call.Details را برای اطلاعات درباره تماس بررسی کنید. به طور خاص، تابع getCallerNumberVerificationStatus() شامل اطلاعاتی از ارائه‌دهنده شبکه در مورد شماره دیگر است. اگر وضعیت تأیید ناموفق بود، این نشانه خوبی است که تماس از یک شماره نامعتبر یا تماس بالقوه هرزنامه است.

کاتلین

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.
                }
            }
        }
    }
}

جاوا

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 می گیرد که می توانید با استفاده از آن به سیستم بگویید تماس را مسدود کند، آن را رد کند، انگار که کاربر انجام داده است، یا آن را خاموش کند. همچنین می‌توانید به سیستم بگویید از افزودن این تماس به گزارش تماس‌های دستگاه به‌کلی رد شود.

کاتلین

// 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)

جاوا

// 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>