[Mobile/Android] 브로드캐스트 수신자(Broadcast Receiver)
브로드캐스트 수신자(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"/>
'Mobile > Android' 카테고리의 다른 글
[Mobile/Android] Intent 객체 (0) | 2021.10.26 |
---|---|
[Mobile/Android] 서비스( Service ) - 백그라운드 프로세스 (0) | 2019.11.18 |
[Mobile/Android] Fragment를 이용한 화면 분할 (0) | 2019.11.04 |
[Mobile/Android] 이벤트 처리 (0) | 2019.10.21 |
[Mobile/Android] Toast - 간단한 메시지를 잠깐 보여주었다가 없어지는 View (0) | 2019.10.20 |
댓글
이 글 공유하기
다른 글
-
[Mobile/Android] Intent 객체
[Mobile/Android] Intent 객체
2021.10.26 -
[Mobile/Android] 서비스( Service ) - 백그라운드 프로세스
[Mobile/Android] 서비스( Service ) - 백그라운드 프로세스
2019.11.18 -
[Mobile/Android] Fragment를 이용한 화면 분할
[Mobile/Android] Fragment를 이용한 화면 분할
2019.11.04 -
[Mobile/Android] 이벤트 처리
[Mobile/Android] 이벤트 처리
2019.10.21