2016. 4. 19. 09:50ㆍAndroid
회원 가입이 필요한 앱을 만들다 보면 문자로 본인 인증을 하게 하는 경우가 있다. 그런데 이 때 문자가 오면 자동으로 입력칸에 인증번호가 채워지는 앱이 있는데 별 건 아니지만 참 편한 기능이지 않은가. 안드로이드는 BroadCastReceiver 라는 것을 이용해서 구현할 수 있다(자세한 건 링크 참조). BroadCastReceiver 는 간단히 말하면 폰 내에서 어떤 일이 생기면 알려주는 일을 수행할 수 있는 녀석이다. 문자가 온다거나 화면이 꺼진다거나 하는 것 말이지. 어쨌든 오늘 할 거는 문자(SMS)를 받아오는 것이니 거기에만 집중해봅시다. 일단 문자를 받아오기 위해서는 권한이 필요하다.
ㅇ AndroidManifest.xml
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<application
...>
<receiver android:name=".SMSReceiver">
<intent-filter >
<!-- 문자를 받아올 수 있게 intent-filter 추가 -->
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
</application>
ㅇ SMSReceiver.java
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으로 변환
}
}
}
}
ㅇ // 앞의 포스팅을 봤다면 알겠지만, sms는 SMS 본문이 담겨있는
// StringBuilder 객체로 toString메서드로 String객체에 담는다
String smsBody = sms.toString();
// "\\d{6}" : 일반적으로 인증번호는 6자리 숫자로 \\d는 숫자, {6}는 자리수이다
Pattern pattern = Pattern.compile("\\d{6}");
// matcher에 smsBody와 위에서 만든 Pattern 객체를 매치시킨다
Matcher matcher = pattern.matcher(smsBody);
String authNumber = null;
// 패턴과 일치하는 문자열이 있으면 그 첫번째 문자열을 authNumber에 담는다
if (matcher.find()) {
authNumber = matcher.group(0);
}
자, 이걸로 인증번호만 쏙 뽑아오게 되었다. 물론 인증번호가 6자리 숫자가 아니라면 다른 패턴을 넣어야겠지만 그때는 정규표현식만 바꿔주면 된다. 이제 그 다음에는 인증번호를 자동으로 입력하게 만드는 것이다. 임시로 인증번호가 입력되는 액티비티를 InputNumberActivity, 액티비티 내에 인증번호가 입력될 EditText를 editTextInputNumber라고 하자.
ㅇ // inputAuthNumber메서드에서 접근해야 하기 때문에 static
private static EditText editTextInputNumber;
// SMSReceiver에서 접근해야하기 때문에 static
public static void inputAuthNumber(String authNumber) {
if (authNumber != null) {
// editTextInputNumber에 받아온 인증번호를 입력
editTextInputNumber.setText(authNumber);
}
}
ㅇif (authNumber != null) {
// static 메서드인 inputAuthNumber를 통해 authNumber를 넘긴다
InputNumberActivity.inputAuthNumber(authNumber);
}
InputNumberActivity에서는 인증번호가 입력될 EditText editTextInputNumber와 인증번호를 넘겨받아 editTextInputNumber에 입력해줄 메서드 inputAuthNumber를 각각 static으로 만들어 놓는다. 그리고 SMSReceiver에서는 인증번호가 저장된 String 객체를 위의 메서드로 넘겨주면 끝.
'Android' 카테고리의 다른 글
QR코드 생성 (0) | 2016.04.25 |
---|---|
@SuppressLint (0) | 2016.04.19 |
웹뷰(Web View) (0) | 2016.04.18 |
AsyncTask (0) | 2016.04.04 |
ListActivity를 상속받아 ListView 구현 (0) | 2016.04.04 |