브로드캐스트 수신자(Broadcast Receiver)


브로드캐스팅(Broadcasting)이란 단어는 네트워크에서 많이 사용되는 단어다.

비슷하게 안드로이드에서 브로드캐스팅은 메시지를 여러 객체에 전달하는 걸 말함.

즉, 내가 만든 앱이 다른 앱으로부터 메시지를 전달받도록 하는 것.

예를 들면, 폰에 기본적으로 깔려있는 SMS(메시지) 앱으로부터 메시지 정보를 전달받는다던가,

카메라 앱으로부터 정보를 받아 내가 만든 앱에서 폰 카메라를 사용할 수 있도록 한다던가,, 등등

 

브로드캐스트 수신자를 등록하기 위해선 BroadcastReceiver 클래스를 상속받아 정의하면 되고,

이때, onReceiver() 메서드를 통해 브로드캐스트 메시지를 전달받을 수 있다.

하지만, 시스템의 모든 메시지를 받을 수는 없는 일. 메시지는 Intent 객체에 담겨 전달되므로,

매니페스트 파일에서 <intent-filter>를 이용해 원하는 메시지만 전달받을 수 있다.

 

아래는 SMS 메시지만 수신받도록 설정한 것

<receiver
    android:name=".SmsReceiver"
    android:enabled="true"
    android:exported="true"
    
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    </intent-filter>
</receiver>

 

SmsReceiver 클래스를 만들어보자

참고로, 여기서 Bundle 객체가 사용됬는데, Intent 객체와 마찬가지로 DTO 객체라 생각하면 됨.

찾아보니 Bundle 객체는 Map 구조를 사용해 정보를 담는다고 함.

public class SmsReceiver extends BroadcastReceiver {

    public static final String TAG = "SmsReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG, "onReceiver() 메서드 호출됨.");

        Bundle bundle = intent.getExtras(); // Intent에서 Bundle 객체 가져오기
        SmsMessage[] messages = parseSmsMessage(bundle);

        if (messages != null && messages.length > 0) {
            String sender = messages[0].getOriginatingAddress();
            Log.i(TAG, "SMS sender : " + sender);

            String contents = messages[0].getMessageBody().toString();
            Log.i(TAG, "SMS contents : " + contents);

            Date receivedDate = new Date(messages[0].getTimestampMillis());
        }
    }

    private SmsMessage[] parseSmsMessage(Bundle bundle) {
        Object[] objs = (Object[]) bundle.get("pdus");
        SmsMessage[] messages = new SmsMessage[objs.length];

        int smsCount = objs.length;
        for (int i=0; i < smsCount; ++i) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                String format = bundle.getString("format");
                messages[i] = SmsMessage.createFromPdu((byte[]) objs[i], format);
            } else {
                messages[i] = SmsMessage.createFromPdu((byte[]) objs[i]);
            }
        }

        return messages;
    }
}

 

SmsMessage 클래스는 안드로이드에서 제공해주는 문자 메시지를 받기 위한 클래스다.

위 코드에서 SmsMessage 객체의 메서드를 이용해 발신자 번호, 문자 내용, 받은 날짜를 구한 후, 로그로 출력했다.

 

이때, 문자 메시지를 받는거는 위험 권한에 속하기 때문에 매니페스트 파일에 권한 설정정보를 추가해줘야한다.

<uese-permission android:name="android.permission.RECCEIVE_SMS"/>