-
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); }
이렇게 전화 수신 이벤트를 잡아 강제로 종료하는 방법에 대해 알아보았습니다. 저도 전화수신을 원천차단하는 방식을 열심히 찾아보았지만 비행기모드가 아니고는 방법이 없는 것 같았는데 혹시나 방법을 아시는 분은 댓글로 남겨주시면 감사하겠습니다!!
'안드로이드' 카테고리의 다른 글
[Jetpack Compose] 너는 뭐냐 (0) 2023.01.06 Android Native 모듈 React Native 에서 사용하기 (0) 2021.06.21 안드로이드 서비스 앱 삭제 및 강제종료 방지하기 (5) 2020.08.24 Room DB 사용하기 (0) 2020.06.30 Android Exoplayer 제스쳐 기능 추가 (0) 2020.05.08 댓글