ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Android SMS Retriever API 사용하기 - SMS 인증번호
    Android 2019. 4. 30. 00:08

    Google Play에서 SMS 또는 Call Log 권한 그룹을 비롯하여 위험성이 높거나 민감한 권한의 사용을 제한하는 정책을 내놓았다.

    여기서 다루고 싶은 내용은 기존에 사용자 편의를 위해서 제공하는 기능이였던 SMS 읽기 기능이다.

    이전에는 RECEIVE_SMS권한을 이용해서 SMS내용을 읽어서 인증번호를 자동입력을 해주었지만 이제는 해당 권한을 추가할 경우 스토어에 등록이 되지 않는다. 기존에 등록되어있던 앱을 경우에는 예외신청을 하지 않으면 Google Play에서 삭제 대상이 된다.

    RECEIVE_SMS권한을 통해서 SMS를 읽어오지는 못하지만 대신 구글에서 다른 방안을 제시하였다.

    바로 SMS Retriever를 이용하여 권한허용 필요없이 문자를 읽을수있다.단 몇가지 제한사항들이 있다.

    Android 단말에 Google Play Service version이 10.2 이상 설치되어 있어야한다.

    그리고 SMS에도 몇가지 규칙을 준수해야한다.

    1. 문자내용이 140byte를 초과하면안된다.

    2. SMS 맨앞에 <#>가 반드시 포함되어야 한다.

    3. SMS 맨마지막에 앱을 식별하는11글자 해시문자열을 포함해야한다.

    ex) <#> 인증번호[1234] Evp3gExcg1e

    이제 소스로 구현하는 부분들을 확인해보자

     

     

    1. build.gradle

     

    1
    2
    compile 'com.google.android.gms:play-services-auth-api-phone:16.0.1'
     
    Colored by Color Scripter

     

     

     

     

    2. AndroidManifest.xml

     

    1
    2
    3
    4
    5
    <receiver android:name=".SmsReceiver" android:exported="true">
        <intent-filter>
            <action android:name="com.google.android.gms.auth.api.phone.SMS_RETRIEVED"/>
        </intent-filter>
    </receiver>
    Colored by Color Scripter

     

     

     

     

    3. SmsReceiver.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public class SmsReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) { // SMS_RETRIEVED_ACTION 필수
                Bundle extras = intent.getExtras();
                Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS);
                switch(status.getStatusCode()) {
                    case CommonStatusCodes.SUCCESS:
                        String message = (String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE);
                        //SMS받은거 파싱
                        break;
                    case CommonStatusCodes.TIMEOUT:
                        //기본 Timeout 시간 5분
                        break;
                }
            }
        }
    }
     
    Colored by Color Scripter

     

     

     

     

    4. MainActivity.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    @Override
    protected void onResume() {
        super.onResume();
            
        SmsRetrieverClient client = SmsRetriever.getClient(this /* context */);
        Task<Void> task = client.startSmsRetriever();
     
        task.addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                IntentFilter intentFilter = new IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION);
                registerReceiver(smsReceiver, intentFilter);
                Log.e("testest""onSuccess");
            }
        });
     
        task.addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.e("testest""onFailure" + e.toString());
            }
        });
    }
     
     
    Colored by Color Scripter

     

     

    이와같은 순서로 소스를구현하고 실행해면 문자를읽고 인증번호 자동입력을 할 수있다. 하지만 <#>와 해쉬코드가 섞인 문자를 받았을때 사용자에게는 거부감이 들 수 있는것은 감안해야할꺼 같다. 필수 기능이 아닌 사용자의 편의성을 위한 기능인 만큼 굳이 사용자에게 거부감을 줄수 있다면 기능을 제외하는것도 나쁘진 않을꺼 같다.

     

     

    댓글

Designed by Tistory.