إنّ الأجهزة التي تعمل بنظام التشغيل 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>