Android 전화 수신 차단하기
이번 포스트에서는 Android 에서 전화 수신을 차단시키는 방법에 대해 알아보겠습니다.
우리는 때때로 전화를 받기 싫을때도 있고 받기 싫은 특정 번호가 있을 수 있습니다.
이 방법은 원천 차단이 아닌 전화 수신 중 자동적으로 거절버튼을 누르는 방식이라는 점을 알아두시기 바랍니다.
먼저 리시버 코드를 작성합니다.
CallReceiver 라는 클래스를 만들고 BroadcastReceiver 를 상속받도록 합니다.
public class CallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
try {
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
String number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)){
TelecomManager tm = (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
try {
Method m = tm.getClass().getDeclaredMethod("endCall");
m.setAccessible(true);
if ((number != null)) {
boolean temp = (boolean)m.invoke(tm);
Toast.makeText(context, Boolean.toString(temp), Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
Toast.makeText(context, "Ring " + number, Toast.LENGTH_SHORT).show();
}
if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_OFFHOOK)){
Toast.makeText(context, "Answered " + number, Toast.LENGTH_SHORT).show();
}
if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_IDLE)){
Toast.makeText(context, "Idle "+ number, Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
제가 위에서 작성한 코드는 무슨 번호든 간에 무조건 전화를 끊어버리는 코드입니다.
7번째 줄을 보면 String 형식으로 number 를 맏아오는 것을 볼 수 있습니다. 저 number 변수를 이용해 number.equals("010-XXXX-XXXX") 와 같은 조건문을 만들어 특정 번호만 차단하게 만들 수 있습니다.
그리고 Android 10 버전부터 endCall 메소드를 사용하는 방식이 달라지면서 위와 같이 TelecomManager 객체를 이용해 endCall 메소드를 불러와야 합니다.
저 리시버 클래스를 작성한 후에는 리시버가 동작할 수 있도록 Manifest 파일에 등록해주어야 합니다. 따라서 AndroidManifest.xml 파일로 넘어가 <application> 태그 내부에 아래 구문을 추가해줍니다.
<receiver android:name=".CallReceiver">
<intent-filter android:priority="999">
<action android:name="android.intent.action.PHONE_STATE" />
<action android:name="android.intent.action.CALL_LOG" />
<action android:name="android.intent.action.DIAL" />
</intent-filter>
</receiver>
리시버에 필요한 action을 등록하고 priority 도 높게 잡아 이벤트를 놓치지 않게 해줍니다.
추가적으로 Manifest 파일에서 해줘야 할 설정이 있습니다. 바로 permission (권한) 부여입니다. 아래의 4가지 permission을 추가해주시면 됩니다.
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
그리고 마지막으로 런타임 permission을 얻어야 하기 때문에 해당 permission 을 얻어오는 코드를 작성합니다.
if (context.checkSelfPermission(Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED
|| context.checkSelfPermission(Manifest.permission.ANSWER_PHONE_CALLS) != PackageManager.PERMISSION_GRANTED
|| context.checkSelfPermission(Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED
|| context.checkSelfPermission(Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED ) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_CALL_LOG, Manifest.permission.ANSWER_PHONE_CALLS, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CALL_PHONE, Manifest.permission.SYSTEM_ALERT_WINDOW}, 1);
}
이렇게 전화 수신 이벤트를 잡아 강제로 종료하는 방법에 대해 알아보았습니다. 저도 전화수신을 원천차단하는 방식을 열심히 찾아보았지만 비행기모드가 아니고는 방법이 없는 것 같았는데 혹시나 방법을 아시는 분은 댓글로 남겨주시면 감사하겠습니다!!