회원 가입이 필요한 앱을 만들다 보면 문자로 본인 인증을 하게 하는 경우가 있다. 그런데 이 때 문자가 오면 자동으로 입력칸에 인증번호가 채워지는 앱이 있는데 별 건 아니지만 참 편한 기능이지 않은가. 안드로이드는 BroadCastReceiver 라는 것을 이용해서 구현할 수 있다. BroadCastReceiver 는 간단히 말하면 폰 내에서 어떤 일이 생기면 알려주는 일을 수행할 수 있는 녀석이다. 문자가 온다거나 화면이 꺼진다거나 하는 것 말이지. 어쨌든 오늘 할 거는 문자(SMS)를 받아오는 것이니 거기에만 집중해봅시다. 일단 문자를 받아오기 위해서는 권한이 필요하다. AndroidManifest.xml 에 권한을 추가하자.
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
다음으로는 아까 말한 BroadCastReceiver 를 상속하는 클래스를 만들어야 한다. 여기서는 SMS를 받아올 거니까 적당히 SMSReceiver라는 이름을 주도록 하자.
public class SMSReceiver extends BroadCastReceiver { // 지정한 특정 액션이 일어나면 수행되는 메서드 @Override public void onReceive(Context context, Intent intent) { // SMS를 받았을 경우에만 반응하도록 if문을 삽입 if (intent.getAction().equals( "android.provider.Telephony.SMS_RECEIVED")) { StringBuilder sms = new StringBuilder(); // SMS문자를 저장할 곳 Bundle bundle = intent.getExtras(); // Bundle객체에 문자를 받아온다 if (bundle != null) { // 번들에 포함된 문자 데이터를 객체 배열로 받아온다 Object[] pdusObj = bundle.get("pdus"); // SMS를 받아올 SmsMessage 배열을 만든다 SmsMessage[] messages = new SmsMessage[pdusObj.length]; for (int i = 0; i < pdusObj.length; i++) { messages[i] = SmsMessage.createFromPdu((byte[]) pdusObj[i]); // SmsMessage의 static메서드인 createFromPdu로 pdusObj의 // 데이터를 message에 담는다 // 이 때 pdusObj는 byte배열로 형변환을 해줘야 함 } // SmsMessage배열에 담긴 데이터를 append메서드로 sms에 저장 for (SmsMessage smsMessage : messages) { // getMessageBody메서드는 문자 본문을 받아오는 메서드 sms.append(smsMessage.getMessageBody()); } sms.toString() // StringBuilder 객체 sms를 String으로 변환 } } } }
<application ...> <receiver android:name=".SMSReceiver"> <intent-filter > <!-- 문자를 받아올 수 있게 intent-filter 추가 --> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver> </application>
위의 SMSReceiver.java를 작성하고 나면 다시 AndroidManifest.xml에 receiver를 등록해야 한다. 그러지 않으면 작동을 안하는데 Activity를 만들고 나서 등록하는 거랑 똑같다고 생각하면 된다. 일단 여기까지만 따라하면 문자 데이터를 받아오는것 까지는 해결이다.
댓글
댓글 쓰기