shine's dev log

[Android] SMS 인증 번호 추출 프로그램 본문

기타

[Android] SMS 인증 번호 추출 프로그램

dong1 2021. 12. 20. 04:53

1. 개요

 

예전에 모바일 프로그래밍 관련 과목에서 간단하게 구현했던 프로그램이다.

프로그램 동작 방식은 매우 간단하나 안드로이드 스튜디오를 처음 써봐서 조금 헤맸던 기억이 난다..

 

프로그램 동작 방식은 다음과 같다.

 

핸드폰에 문자로 6자리 인증 코드가 오면 ( "[NICE ID 본인확인] 인증번호 [919153]를 입력해 주세요." ) 해당 문자 내용에서 6자리 인증 번호만 추출하여 본 어플리케이션에 표시해주는 프로그램이다.

 

코드는 아래에서 확인할 수 있다.

 

https://github.com/godeastone/sms-receiver

 

 

 

2. 구현

 

이 프로그램을 구현하기 위해 사용된 핵심 내용은, 안드로이드 운영체제에서 사용되는 Broadcast Receiver 이란 개념이다.

 

만약 핸드폰에 문자나 전화가 오는 등의 특정 이벤트가 발생하면, 안드로이드에서는 시스템 전체에 해당 내용을 Broadcast 한다. 해당 Broadcast 내용을 내 앱에서도 받아보고 싶으면, Broadcast Receiver 에 등록을 해주어야 한다.

 

참고로 Broadcast 하고, 내용을 받아오고 하는것들은 모두 Intent 를 통해 수행된다.

 

이렇게 Broadcast Receiver를 통해 수신한 문자 내용을 parsing 하여 6자리 숫자코드를 획득한 뒤, 본 어플에 띄워주면 끝이다. (간-단)

 

 

 1) 권한 획득

 

Broadcast Receiver를 통해 받은 문자 내용을 확인하려면 우선 권한을 획득해야한다.

 

private void requirePermission(){
    String[] permissions = {Manifest.permission.RECEIVE_SMS};
    int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS);
    if(permissionCheck == PackageManager.PERMISSION_DENIED){
        ActivityCompat.requestPermissions(this, permissions, 1);
    }
}

 

위 코드를 통해 Manifest.permission.RECEIVE_SMS 라는 문자 수신과 관련된 권한을 획득할 수 있다. 만약 획득 권한이 없는 경우 requestPermissions 를 통해 사용자에게 권한 획득을 요청한다.

 

 

 2) 문자에서 번호 추출하기

 

@Override
public void onReceive(Context context, Intent intent) {
    Log.d(TAG, "onReceive() called");

    String number = "";
    Bundle bundle = intent.getExtras();
    //parsing message
    SmsMessage[] messages = parseMessage(bundle);

    if(messages.length > 0) {
        String sender = messages[0].getOriginatingAddress();
        String content = messages[0].getMessageBody().toString();
        Date date = new Date(messages[0].getTimestampMillis());

        //extract numbers in SMS message
        number = content.replaceAll("[^0-9]", "");
        //for Debug
        Log.d(TAG, "sender : " + sender);
        Log.d(TAG, "content : " + content);
        Log.d(TAG, "date : " + date);

        //send number to activity
        sendToActivity(context, number);
    }
}

 

위 코드를 통해 수신받은 문자 데이터 intent를 가공하여, 6자리 숫자 데이터만 뽑아내게 된다. 이후 sendToActivity를 통해 activity에게 해당 숫자를 넘겨준다.

 

그 결과, 개발한 앱을 켜둔 상태로 "[NICE ID 본인확인] 인증번호 [919153]를 입력해 주세요." 라는 문자 메시지를 받으면 아래 사진과 같은 결과를 얻을 수 있다.

 

 

 

 

3. 참고자료

 

https://ju-hy.tistory.com/50