안드로이드에서 브로드캐스팅(Broadcasting)은 시스템에서 발생한 이벤트나 사용자 정의 이벤트를 다른 앱이나 시스템 구성요소에 알리는 메커니즘이다. 예를들면 문자, 카카오톡, 배터리상태 등이 있다.
우리가 만든 앱에서 브로드캐스팅 메시지를 받고 싶다면 브로드캐스트 수신자를 만들어 앱에 등록하면 된다.
여기에선 문자 메시지를 앱으로 수신하는 방법을 예제로 작성해본다.
<receiver
android:name=".SMSReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
먼저 AndroidManifest.xml에 SMS를 수신하기위해서 receiver 태그를 추가해야 한다. 이후 SMS를 필터링 하기 위해 intent-filter 태그를 사용하여 액션 정보를 넣는다. 해당 코드는 SMS 수신만 받겠다는 의미가 된다.
<uses-feature
android:name="android.hardware.telephony"
android:required="false" />
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
또한, 이렇게 SMS를 수신하는 행위는 제한된 데이터에 추가로 액세스를 하는 것이므로 런타임 권한 선언이 필요하다.
이를 위해 <uses-permission> 태그에 RECEIVE_SMS 권한을 추가한 후, SMS은 telephony와 연관이 있으므로 해당 하드웨어가 반드시 필요로 하는지 아닌지 설정해야 한다.
만약 required를 true로 하면 전화기능이 안되는 기기에서는 앱 설치가 불가능하다.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActivityResultLauncher<String> requestPermissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), new ActivityResultCallback<Boolean>(){
@Override
public void onActivityResult(Boolean o){
if(o){
Toast.makeText(MainActivity.this, "권한허용됨", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this, "권한거부됨", Toast.LENGTH_SHORT).show();
}
}
});
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.RECEIVE_SMS) == PackageManager.PERMISSION_GRANTED) {
// 사용자가 이미 앱에 RECEIVE_SMS 권한을 부여 했다면
Toast.makeText(MainActivity.this, "이미 권한을 가지고 있음", Toast.LENGTH_SHORT).show();
} else if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.RECEIVE_SMS)) {
// 권한을 거부 했을 때 권한이 필요한 이유를 설명하고 다시 요청하거나 다른 처리를 할 수 있음
Toast.makeText(MainActivity.this, "권한에 대해서 설명하고 다시 권한 요청", Toast.LENGTH_SHORT).show();
requestPermissionLauncher.launch(android.Manifest.permission.RECEIVE_SMS);
} else {
// 사용자가 이미 앱에 RECEIVE_SMS 권한을 부여하지 않았고 거부한적이 없다면
Toast.makeText(MainActivity.this, "시스템한테 권한 요청", Toast.LENGTH_SHORT).show();
requestPermissionLauncher.launch(android.Manifest.permission.RECEIVE_SMS);
}
}
이 후 사용자에게 런타임 권한을 요청해줘야 한다. 위와 같이 콜백메서드를 구현하고 사용자가 이미 앱에 특정 권한을 부여했는지 ContextCompat.checkSelfPermission() 메서드를 통해 해당 권한을 전달해 반환 값을 확인 후 부여하지 않았다면 shouldShowRequestPermissionRationale() 를 호출하여 true를 반환하면 권한이 필요한 이유를 설명한다.
참고로 권한 거부 후 shouldShowRequestPermissionRationale() 에서 true를 반환하여 다시 권한 요청이 들어갔을 때 또 다시 거부하면 자동으로 다시 묻지 않음 처리가 되어 재요청하지 않게 된다.
댓글