SMS 인증번호 받기

2016. 4. 19. 09:50Android

반응형

회원 가입이 필요한 앱을 만들다 보면 문자로 본인 인증을 하게 하는 경우가 있다. 그런데 이 때 문자가 오면 자동으로 입력칸에 인증번호가 채워지는 앱이 있는데 별 건 아니지만 참 편한 기능이지 않은가. 안드로이드는 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 객체를 위의 메서드로 넘겨주면 끝.

 

[출처] http://bonoogi.postype.com/post/597/

반응형

'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