안녕하세요?


이번 시간에는 브로드 캐스팅(BroadCasting)이라고 해서, 메세지를 여러객체에 걸쳐서 전달하는 것을 만하는 것에 관한 실습을 할 예정인데, Do it 안드로이드 앱 프로그래밍 이라는 책에서는 한 챕터에 걸쳐서 설명을 했지만, 직접 실습해 보니 포스팅 하나로 끝내기에는 양이 많아서, 2개의 포스팅에 걸쳐서 블로그에 올려야 할 정도로 내용이 방대합니다.


우선 실습에 들어가기 위해서 SampleReceiver라는 프로젝트를 생성하도록 합니다. 그리고 나서 package explorer 윈도우에서 우클릭을 해서 아래의 스크린샷처럼 메뉴를 불러 오도록 합니다.



New메뉴에서 Other항목을 선택해서 Broadcast Receiver를 선택하도록 합니다. 이어서 다음 스크린샷과 같이 브로드 캐스트 리시버의 이름을 입력하도록 합니다.



이번 경우에는 SmsReceiver라고 지정을 하였으며, 블로그의 화면에는 직접 올리지는 않았지만, 안드로이드 스튜디오에서는 SmsReceiver.java라는 파일이 생성이 됩니다. 먼저 맨 처음 생성될 상태의 AndroidManifest.xml을 보도록 하겠습니다.



여기서 receiver에 있는 항목에다가 다음과 같은 코드를 추가해 주도록 합니다.



위 코드의 내용은 다른 것 없이 SMS메세지를 받아볼 수 있도록 하는 것에 의의가 있습니다. 이 이상도 있는 것 같기는 한데, 아직 저로서는 이 이상의 의미는 알 수 없었습니다.


다음은 SmsReceiver.java로 가서 다음의 코딩을 시작합니다.



제일 처음 클릭해서 들어가면 위 스크린샷과 같이 있는 것을 볼 수 있습니다. 이 상태에서 먼저 TODO에서 throw와 같은 구문까지를 지우고 본격적으로 코딩에 들어가도록 합니다.



먼저 public static final String TAG = "SmsReceiver"; 라는 구문으로 아래에 등장할 Log.i에 첫 문자열을 미리미리 지정하도록 합니다. 

그리고 나서 아래에 이어지는 Log.i()구문은 책에서는 제대로 onReceive()메서드가 호출이 되는지를 알아보기 위해서 라고 했습니다만, 제 경우에는 크게 도움이 되지는 않았습니다.


이어지는 SmsMessage[]란 항목과 parseSmsMessage(bundle)이라는 항목이 붉은 색으로 되어 있는데, 우선 SmsMessage[]라는 항목이 android.telephony라는 패키지에 묶여야 하는데, 이게 자동으로 안되고, 다른 유사한 패키지가 있어서 유저가 직접 지정하라는 의미입니다. 지정을 위해서는 Alt + Enter키를 누르면 됩니다.



이렇게 android.telephony를 지정하고 나서 붉은색으로 되어 있는 부분이 사라진 것을 볼 수 있습니다. 물론 여기서 아직까지도 붉은색으로 남아 있는 parseSmsMessage(bundle)이라는 것은 임의로 정의된 메서드로, 나중에 지정을 하도록 하겠습니다. 일단은 if 구문으로 넘어가 보도록 하겠습니다.


if (messages!=null && messages.length>0){ 


이 구문에서는 message가 비어있지 않고, 그 내용이 있을 경우, 즉 SMS메세지가 도착했고, 내용이 조금이라도 있는 경우에 다음과 같이 실행을 하라는 의미입니다.


String sender = messages[0].getOriginatingAddress();


여기서 sender는 변수명이라서 다른 이름으로 지정을 해도 상관이 없습니다. 그리고 제 능력으로는 알아보려고 했는데, 왜 message[0]에서 [0]이 붙는지 이유를 모르겠습니다.아무는 뒤에 오는 getOriginatingAddress()라는 메서드가 바로 SMS메세지를 보낸 번호를 잡아내는 메서드인 것은 알겠습니다. 즉, 이 구문은 SMS메세지가 도착하고 그 내용이 있으면, 전화번호를 캐치해 내라는 의미입니다.



이어서 String contents = messages[0].getMessageBody().toString(); 이라는 구문이 옵니다. 이 구문이 위 스크린샷에서는 가려져서 안 보이는데, 아무튼 내용은 SMS메세지 내용을 받아서, 그걸 String이라는 데이터 형태로 변형 하라는 의미를 지니고 있습니다.


그리고 그 아래에 나오는 다음과 같은 구문이 있는데, 붉은색으로 에러라는 의미를 지니고 있는 것을 보실 수 있으실 겁니다.


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


여기서 Date라는 항목은 여러개의 패키지 내용에서 하나를 선택해야 에러가 사라지기 때문에, 직접 Alt + Enter를 눌러서 java.until이라는 패키지로 묶도록 해야 합니다.



패키지를 선택하고 나서야 붉은색으로 처리된 에러가 사라진 것을 보실 수 있습니다.



이제 마지막으로 Log.i()메서드를 추가해서 제대로 작동하는 지를 나중에 Logcat을 통해서 책에서는 알아볼 수 있다고는 했습니다만, 제가 직접 해 보니 이를 알아보기는 힘들었습니다. 아무튼 Log.i() 메소드까지 추가하는 데 성공했으니, 이제 본격적으로 parseSmsMessage(bundle)메서드를 정의하러 가볼 시간입니다.



우선 시작부터 private SmsMessage[] parseSmsMessage(Bundle bundle){로 되어 있는데, 여기서 SmsMessage는 반환값이라는 것은 알만합니다. 하지만 여기서도 여전히 []이 왜 붙었는지는 아직 이해가 되지 않습니다. 아무튼 이런 시작값을 만들어 주고서 위 스크린샷과 같은 코딩을 합니다.


이는 책에서도 자세한 설명이 없어서 크게 이해는 안되지만, 한가지 알 수 있는 것이, 이 코드 전체가 바로 SMS메세지를 확인할 수 있도록 API에서 설정을 해둔 메서드라고 합니다. 제 능력으로는 이 메서드를 어떻게 변형을 가하는 것 보다는 이대로 다른 앱에서도 써먹도록 하는 것이 좋다는 생각이 듭니다.


Private SmsMessage[] pareseSmsMessage(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++){

  String format = bundle.getString("format");

  messages[i] = SmsMessage.createFromPdu((byte[])objs[i],format)}

 else{

  messages[i] = SmsMessage.createFromPdu((byte[])objs[i]);}

}

return messages;

}


이제 1차적인 코딩은 끝이 났으니, 이번에는 권한을 획득하러 가야 합니다. 다시 AndroidManifest.xml로 가서 다음과 같이 코드를 추가하도록 합니다.



위와 같이 SMS 메세지를 받을 수 있도록 권한을 추가하도록 합니다. 그런데 문제는 이 권한이 API23이상 부터는 위험권한으로 처리가 되어서 그냥은 어떻게 할 수 없다고 합니다. 그래서 이를 가능하도록 하기 위해서 편법을 쓰도록 하겠습니다.



build.gradle(Module:app)으로 가서 targetSdkVersion을 원래 25로 되어 있는 것을 22로 변경하도록 합니다. 그리고 나서 이를 USB에 연결한 스마트폰에서 이 앱을 실행시키면 인스톨 과정에서 보통 에러가 나기 때문에, 하는 수 없이 안드로이드 스튜디오 내의 에뮬레이터를 통해서 실행을 시키도록 합니다.



먼저 에뮬레이터가 커피한잔 마실 정도의 시간이 흐르고 나면, 이렇게 뜹니다. 여기서 가장 아래의 ... 항목을 눌러서 아래의 스크린샷과 같이 문자를 보내도록 합니다.



여기서 Phone이라는 항목을 클릭하면 위 스크린샷과 같은 화면이 뜨는에 번호는 아무 번호나 입력하도록 하고, 메세지의 내용을 정하도록 합니다. 그리고 나서 아래에 있는 Send Message를 눌러서 가장의 에뮬레이터로 메세지를 보내도록 합니다.



Android Monitor를 통해서 logcat을 살펴본 내용입니다. 여기서 살펴보면, onReceive라는 메서드가 호출되는 것을 확인할 수 있습니다. 이것으로 어떻게 제가 SMS메세지를 폰으로 보내면 받는 것을 실습해 보았으며, 이제 이 메세지를 받아서 어떻게 하면 화면에 띄울 수 있는지를 실습해야 하는데, 이 내용은 너무 포스팅의 내용이 길어져서 part2에서 다루도록 하겠습니다.

+ Recent posts

티스토리 툴바