본문 바로가기
Android

안드로이드 코틀린 SMS(문자) 인증번호 자동입력 BroadcastReceiver

by 일용직 코딩노동자 2022. 1. 19.
728x90
반응형

문자로 오는 인증번호를 추출하는 브로드케스트 리시버(BroadcastReceiver) 를 해보겠습니다.

 

우선 BroadcastReceiver 클래스를 만들어볼게요.

 

 

 

클래스 이름은 SMSReceiver로 지었습니다!

 

그리고 메니페스트에서 퍼미션 추가해줄게요.!

<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />

원래는 RECEIVE_SMS만 있어도 되는데 저는 나중에 뭐 또 쓸 일 있을거같아서 3개 다 넣었습니다..

 

그리고 메니페스트에서 리시버를 등록해줘야 합니다.

 

<receiver
    android:name=".SMSReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

이렇게 액션도 추가하여 달아줬습니다.

 

class SMSReceiver : BroadcastReceiver()  {
    
    override fun onReceive(context: Context?, intent: Intent?) {
        if(intent?.action.equals("android.provider.Telephony.SMS_RECEIVED")){
           
        }
    }
}

이렇게 onReceive에서 if 조건문을 걸어주겠습니다.

만약 onReceive가 없는 분들은

 

윈도우는 ctrl + O 맥은 command + O 누르시면 현재 커서가 잡힌 블럭 안에서 오버라이드 가능한 리스트가 나옵니다.

 

if조건문에서 android.provider.Telephony.SMS_RECEIVED는  문자가 왔을때 발생되는 intent action 입니다.

 

문자가 왔을때만 동작 하겠다는겁니다..!!

 

그리고 onReceive 밖에 함수를 하나 만들어주겠습니다.

 

fun smsMessageParse(bundle: Bundle): Array<SmsMessage?>? {
    val objs = bundle["pdus"] as Array<Any>?
    val messages: Array<SmsMessage?> = arrayOfNulls<SmsMessage>(objs!!.size)
    for (i in objs!!.indices) {
        messages[i] = SmsMessage.createFromPdu(objs[i] as ByteArray)
    }
    return messages
}

 

문자 내용을 파싱해오는 함수입니다!

 

그럼 onReceive로 돌아오셔서 이어서 작성해줄게요.

 

override fun onReceive(context: Context?, intent: Intent?) {
    if(intent?.action.equals("android.provider.Telephony.SMS_RECEIVED")){
        val bundle = intent?.extras
        val messages = smsMessageParse(bundle!!)
    }
}

intent로부터 내용을 받아온 후에 방금 작성하신 함수를 호출하여 내용을 파싱해줍니다.

 

override fun onReceive(context: Context?, intent: Intent?) {
    if(intent?.action.equals("android.provider.Telephony.SMS_RECEIVED")){
        val bundle = intent?.extras
        val messages = smsMessageParse(bundle!!)

        if(messages?.size!! > 0){
            val content = messages[0]?.messageBody.toString()
            val certNumber = content?.replace("[^0-9]".toRegex(),"")
            Log.d("인증번호 추출 ",certNumber)
        }
    }
}

그리고 나서 메세지가 있는 경우 메세지 내용을 String으로 변환해서 가져오시고나서

 

그 메세지에서 패턴을 이용하여 숫자만 추출하여 가져옵니다!

 

그럼 로그에 인증번호가 딱 찍히는데요!

 

저는 이 값을 글로벌 클래스에있는 변수에 저장해서 사용했답니다.

 

이상이에요!

728x90
반응형

댓글