تصفية المكالمات

إنّ الأجهزة التي تعمل بنظام التشغيل Android 10 (المستوى 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 في ملف البيان باستخدام فلتر الأهداف المناسب والإذن المناسب حتى يتمكن النظام من تشغيله بشكل صحيح.

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