ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Android 전화 수신 차단하기
    안드로이드 2020. 12. 7. 15:35

    이번 포스트에서는 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);
        
    }

    이렇게 전화 수신 이벤트를 잡아 강제로 종료하는 방법에 대해 알아보았습니다. 저도 전화수신을 원천차단하는 방식을 열심히 찾아보았지만 비행기모드가 아니고는 방법이 없는 것 같았는데 혹시나 방법을 아시는 분은 댓글로 남겨주시면 감사하겠습니다!!

    댓글

Designed by Tistory.