ارزیابی مشخصات تماس

دستگاه‌هایی که Android نسخه ۱۰ (سطح میانای برنامه‌سازی کاربردی ۲۹) یا بالاتر را اجرا می‌کنند به برنامه شما اجازه می‌دهند تماس‌های دریافتی از شماره‌هایی را که در دفترچه تلفن کاربر نیستند به‌عنوان تماس‌های هرزنامه احتمالی شناسایی کند. کاربران می‌توانند انتخاب کنند که تماس‌های هرزنامه بی‌صدا رد شوند. برای ارائه شفافیت بیشتر به کاربران هنگام ازدست دادن تماس‌ها، اطلاعات مربوط به این تماس‌های مسدودشده در گزارش تماس ثبت می‌شود. استفاده از 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>