투케이2K

653. (Android/Java) 구글 서비스 SMS Receiver 사용해 SMS 문자 수신 확인 - SmsRetriever.SMS_RETRIEVED_ACTION 본문

Android

653. (Android/Java) 구글 서비스 SMS Receiver 사용해 SMS 문자 수신 확인 - SmsRetriever.SMS_RETRIEVED_ACTION

투케이2K 2023. 9. 15. 21:21

[개발 환경 설정]

개발 툴 : AndroidStudio

 

[소스 코드]

 

[1]. build gralde 의존성 설정

    // -----------------------------------------------------------

    // [구글 인증 API : SMS 문자]
    implementation 'com.google.android.gms:play-services-auth:16.0.1'
    implementation 'com.google.android.gms:play-services-auth-api-phone:16.0.0'

    // -----------------------------------------------------------










[2]. SMS 수신 감지를 위한 BroadcastReceiver 클래스 생성

package com.example.javaproject;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

import com.google.android.gms.auth.api.phone.SmsRetriever;
import com.google.android.gms.common.api.CommonStatusCodes;
import com.google.android.gms.common.api.Status;

public class SmsReceiver extends BroadcastReceiver {


    /**
     * // --------------------------------------------------------------------------------------
     * TODO [클래스 설명]
     * // --------------------------------------------------------------------------------------
     * 1. SMS 문자 수신 리시버 클래스
     * // --------------------------------------------------------------------------------------
     * 2. 참고 사항 :
     *
     *   - 문자 메시지 전체의 길이는 140 byte 를 넘으면 안됩니다
     *   - 문자의 맨 앞에는 <#> 이 붙어야 합니다 : <#> 인증번호[5678] iTDNzfk84TL
     *   - 문자의 맨 뒤에는 앱의 해시 키가 필요 합니다 (9글자) : iTDNzfk84TL
     *   - 해시 키 값이 올바르지 않으면 문자 수신이 되지 않습니다
     *     (debug, release, market 구분 필요)
     * // --------------------------------------------------------------------------------------
     * 3. 참고 사이트 : 앱 해시 키 추출 방법 : https://prishanmaduka.medium.com/generate-hash-keys-properly-for-android-sms-retriever-api-c26b9be42ddc
     * // --------------------------------------------------------------------------------------
     * */





    /**
     * // --------------------------------------------------------------------------------------
     * TODO [빠른 로직 찾기 : 주석 로직 찾기]
     * // --------------------------------------------------------------------------------------
     * // [SEARCH FAST] : []
     * // --------------------------------------------------------------------------------------
     *
     * // --------------------------------------------------------------------------------------
     *
     * // --------------------------------------------------------------------------------------
     *
     * // --------------------------------------------------------------------------------------
     *
     * // --------------------------------------------------------------------------------------
     */





    // -----------------------------------------------------------------------------------------
    // TODO [전역 변수 선언]
    // -----------------------------------------------------------------------------------------
    private static final String ACTIVITY_NAME = "SmsReceiver";
    private static final String SmsAction = "com.google.android.gms.auth.api.phone.SMS_RETRIEVED";





    // -----------------------------------------------------------------------------------------
    // TODO [onReceive : 이벤트 수신]
    // -----------------------------------------------------------------------------------------
    @Override
    public void onReceive(Context context, Intent intent) {
        
        if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) {
            try {
                S_Log._D_("SmsReceiver : onReceiver : SMS_RETRIEVED_ACTION", null);

                Bundle extras = intent.getExtras();
                Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS);

                switch (status.getStatusCode()) {
                    case CommonStatusCodes.SUCCESS: // TODO [문자를 받은 경우]

                        String message = (String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE);

                        S_Log._W_("SmsReceiver : onReceiver : SUCCESS", new String[]{
                                String.valueOf(message)
                        });

                        // -------------------------------------
                        // [뷰에 메시지 전달 실시]
                        // -------------------------------------

                        break;
                    case CommonStatusCodes.INVALID_ACCOUNT: // TODO [INVALID_ACCOUNT]
                        S_Log._E_("SmsReceiver : onReceiver : INVALID_ACCOUNT", null);
                        break;
                    case CommonStatusCodes.INTERRUPTED: // TODO [INTERRUPTED]
                        S_Log._E_("SmsReceiver : onReceiver : INTERRUPTED", null);
                        break;
                    case CommonStatusCodes.NETWORK_ERROR: // TODO [NETWORK_ERROR]
                        S_Log._E_("SmsReceiver : onReceiver : NETWORK_ERROR", null);
                        break;
                    case CommonStatusCodes.ERROR: // TODO [ERROR]
                        S_Log._E_("SmsReceiver : onReceiver : ERROR", null);
                        break;
                    case CommonStatusCodes.CANCELED: // TODO [CANCELED]
                        S_Log._E_("SmsReceiver : onReceiver : CANCELED", null);
                        break;
                    case CommonStatusCodes.API_NOT_CONNECTED: // TODO [API_NOT_CONNECTED]
                        S_Log._E_("SmsReceiver : onReceiver : API_NOT_CONNECTED", null);
                        break;
                    case CommonStatusCodes.TIMEOUT: // TODO [TIMEOUT]
                        S_Log._E_("SmsReceiver : onReceiver : TIMEOUT", null);
                        break;
                }
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }
    }


} // TODO [클래스 종료]










[3]. Manifest.xml 파일에 리시버 설정 수행

        <!-- ============================================================= -->
        <!-- [SMS 문자 수신 리시버] -->
        <!-- ============================================================= -->
        <receiver
            android:name=".SmsReceiver"
            android:permission="com.google.android.gms.auth.api.phone.permission.SEND"
            android:exported="true">
            <intent-filter>
                <action android:name="com.google.android.gms.auth.api.phone.SMS_RETRIEVED" />
            </intent-filter>
        </receiver>










[4]. 액티비티 전역 변수, onCreate , onDestroy 부분에 리시버 등록 , 해제 코드 작성

        // ---------------------------------------------------------------
        // [전역 변수 : SMS 클래스 지정]
        // ---------------------------------------------------------------
        SmsReceiver smsReceiver = null;



        // ---------------------------------------------------------------
        // [onCreate : 리시버 등록]
        // ---------------------------------------------------------------
        SmsRetrieverClient client = SmsRetriever.getClient(this);
        Task<Void> task = client.startSmsRetriever();

        task.addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {

                if (smsReceiver != null){
                    unregisterReceiver(smsReceiver);
                }
                smsReceiver = new SmsReceiver();

                IntentFilter intentFilter = new IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION);
                registerReceiver(smsReceiver, intentFilter);

                S_Log._W_("SmsRetrieverClient : onSuccess", null);

            }
        });

        task.addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                S_Log._E_("SmsRetrieverClient : onFailure", new String[]{
                        String.valueOf(e.getMessage())
                });
            }
        });



        // ---------------------------------------------------------------
        // [onDestroy : 리시버 해제]
        // ---------------------------------------------------------------
         try {
            if (smsReceiver != null){
                unregisterReceiver(smsReceiver);
            }
        }
        catch (Exception e){}

 

반응형
Comments