도움말 / 통화 스크리닝 구조

모르는 번호 전화를 자동으로 거절하는 원리

차단 앱이 벨을 아예 울리지 않고 조용히 전화를 걸러낼 수 있는 이유는, 안드로이드가 전화 앱과는 별개로 "통화 스크리닝"이라는 역할을 따로 두고 있기 때문입니다.

스팸·광고 전화를 자동으로 거절해 주는 앱을 쓰다 보면, 벨이 한 번도 울리지 않고 조용히 차단되는 경우와 벨이 한두 번 울리다 끊기는 경우를 둘 다 본 적이 있을 겁니다. 이 차이는 우연이 아니라 안드로이드가 제공하는 구조 자체에서 비롯됩니다.

CallScreeningService — 기본 전화 앱이 아니어도 되는 역할

안드로이드에는 CallScreeningService라는 시스템 구조가 있습니다. 이름 그대로 걸려오는 전화를 "심사(screening)"해서 통과시킬지, 거절할지, 무음으로 처리할지를 판단하는 역할입니다. 중요한 점은 이 역할이 기본 전화 앱(default dialer)일 필요가 없다는 것입니다. 별도의 통화 스크리닝 역할을 시스템에 등록해 두면, 전화 앱 자체를 갈아치우지 않고도 걸려오는 전화를 먼저 가로채 판단할 수 있습니다.

5초 안에 응답해야 한다

이 구조에는 엄격한 시간 제약이 있습니다. 구글 공식 문서는 스크리닝 서비스가 전화 한 건에 대해 응답해야 하는 시한을 다음과 같이 명시합니다.

"A CallScreeningService must respond to a call within 5 seconds."

즉 전화가 걸려오면 시스템은 등록된 스크리닝 앱에 판단을 요청하고, 그 앱이 최대 5초 안에 "통과시킨다 / 거절한다 / 무음 처리한다" 중 하나로 응답하기를 기다립니다. 5초 안에 응답이 없으면 시스템은 타임아웃으로 처리하고 넘어갑니다.

응답 전까지는 벨이 울리지 않는다

여기서 실용적으로 중요한 사실이 하나 더 있습니다. 스크리닝 앱이 응답을 하기 전까지는, 즉 그 5초의 대기 시간 동안은 사용자의 기기에서 벨이 울리지 않습니다. 공식 문서의 표현은 다음과 같습니다.

"...the user's device will not begin ringing until the response is received (or the timeout is hit)."

이 두 사실을 합치면 벨이 안 울리고 조용히 차단되는 원리가 설명됩니다. 스크리닝 앱이 전화가 걸려온 즉시 판단을 마치고 "거절"로 빠르게 응답하면, 사용자의 기기는 애초에 벨을 울릴 기회조차 없이 통화가 종료됩니다. 반대로 스크리닝 앱이 없거나, 판단이 느려 타임아웃에 걸리거나, 통과로 응답하면 그때부터 평소처럼 벨이 울립니다.

5초 제약이 앱 설계에 주는 영향

5초라는 시한은 짧습니다. 그래서 스크리닝 앱을 잘 만들려면, 시간이 오래 걸릴 수 있는 무거운 작업 — 예를 들어 원격 서버에 번호를 조회하거나, 대용량 데이터베이스를 뒤지는 작업 — 은 이 5초 안에 끝내려 하지 말고, 먼저 빠르게 판단 가능한 범위 안에서 1차 응답을 하고, 무거운 조회는 응답 이후로 미뤄야 합니다. 로컬에 캐시된 번호 목록이나 연락처처럼 즉시 확인 가능한 정보로만 5초 안의 판단을 내리는 것이 안전한 설계입니다.

즉시 거절 외에 "일정 시간 통화가 연결된 뒤 끊기" 같은 동작도 가능하긴 하지만, 이는 스크리닝 응답과는 다른 별도의 권한과 경로를 요구하는 기능입니다. 이 글에서 다루는 5초 응답·벨 억제 구조와는 구분해서 이해해야 합니다.

기본 전화 앱을 바꾸지 않아도 된다

이 구조가 실용적인 이유는 사용자 입장에서 아무것도 바꾸지 않아도 되기 때문입니다. 평소 쓰던 전화 앱(제조사 기본 다이얼러든 다른 앱이든)을 그대로 두고, 차단 기능만 별도의 스크리닝 앱으로 추가할 수 있습니다. 만약 스크리닝 기능이 기본 전화 앱에만 허용됐다면, 차단 기능 하나를 쓰기 위해 평소 쓰던 전화 앱 전체를 포기해야 했을 겁니다. 역할을 분리해 둔 덕분에 통화 UI는 익숙한 것을 그대로 쓰면서 차단 로직만 다른 앱에 맡기는 조합이 가능합니다.

자주 헷갈리는 부분

스크리닝 앱을 켜두면 전화가 아예 안 울리나요?

아닙니다. 스크리닝 앱이 "거절"이나 "무음"으로 응답한 통화만 벨이 억제됩니다. 앱이 특별한 판단을 내리지 않고 "통과"로 응답하거나, 5초 타임아웃이 될 때까지 아무 응답이 없으면 평소처럼 벨이 울립니다. 즉 이 구조는 모든 전화를 막는 것이 아니라, 스크리닝 앱이 명시적으로 거른 전화만 선별적으로 억제하는 구조입니다.

왜 굳이 5초라는 짧은 시한을 뒀을까요?

전화를 받는 사람 입장에서 벨이 너무 늦게 울리기 시작하면 정상적인 전화조차 응답 타이밍을 놓치게 됩니다. 스크리닝 판단이 통화 연결 자체를 지연시키는 요인이 되지 않도록, 판단에 쓸 수 있는 시간을 짧게 제한해 둔 것으로 이해할 수 있습니다. 그래서 이 구조 위에서 앱을 만들 때는 "느리더라도 정확하게"가 아니라 "5초 안에 확정적으로 판단 가능한 조건만" 로직에 넣는 설계가 필요합니다.

실용적으로 쓰이는 조건 분기

이 구조 위에서 실제로 많이 쓰이는 차단 조건은 복잡하지 않습니다.

이런 조건들은 모두 로컬에서 빠르게 판단할 수 있는 정보이기 때문에 5초 제약 안에서도 무리 없이 동작합니다. 반대로 "이 번호가 최근에 신고된 스팸인가" 같은 판단을 실시간 서버 조회로 하려는 경우에는, 응답 시한을 넘기지 않도록 캐시나 사전 동기화 같은 보완 설계가 필요합니다.

정리