Notice
Recent Posts
Recent Comments
Link
투케이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){}
반응형
'Android' 카테고리의 다른 글
Comments