Urządzenia z Androidem 10 (poziom interfejsu API 29) lub nowszym umożliwiają aplikacji identyfikowanie
połączenia z numerów spoza książki adresowej użytkownika jako potencjalny spam
połączeń. Użytkownicy mogą dyskretnie odrzucać połączenia spamowe. W celu zapewnienia większej
dostęp do informacji o nieodebranych połączeniach, informacje o zablokowanych
są rejestrowane w rejestrze połączeń. Korzystanie z interfejsu API Androida 10 eliminuje
wymagane do uzyskania
READ_CALL_LOG
zgody użytkownika w celu udostępniania funkcji filtrowania połączeń i identyfikacji rozmówcy
funkcji.
Używasz
CallScreeningService
do filtrowania połączeń. Wywołaj funkcję
onScreenCall()
dla wszystkich nowych połączeń przychodzących lub wychodzących, gdy numeru nie ma w
z listy kontaktów użytkownika. Informacje na temat
Call.Details
– obiekt z informacjami
o rozmowie. Mówiąc konkretnie,
getCallerNumberVerificationStatus()
zawiera informacje od dostawcy sieci o innym numerze.
Jeśli stan weryfikacji się nie powiódł, jest to dobry znak, że połączenie zostało
z nieprawidłowego numeru lub połączenia, które może być spamem.
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 } } } }
Ustaw funkcję onScreenCall()
do wywoływania
respondToCall()
.
aby poinformować system, jak ma zareagować na nowe połączenie. Ta funkcja przyjmuje
CallResponse
za pomocą którego można przekazać systemowi zablokowanie połączenia, odrzucanie go tak, jakby
zrobić to przez użytkownika, lub je wyciszyć. Możesz też ustawić pominięcie dodawania
do rejestru połączeń urządzenia.
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());
Musisz zarejestrować implementację CallScreeningService
w pliku manifestu
z odpowiednim filtrem intencji i uprawnieniami, aby system mógł aktywować
i poprawne dane.
<service
android:name=".ScreeningService"
android:permission="android.permission.BIND_SCREENING_SERVICE">
<intent-filter>
<action android:name="android.telecom.CallScreeningService" />
</intent-filter>
</service>