본문 바로가기
IT/Android

Android] Sms 자동입력 Java 버전

by 깻잎쌈 2023. 3. 8.
반응형
  1. 메시지 내용은 <#> 로 시작.
  2. 메시지 내용은 140 byte 이하.
  3. 11자리 Hash Key 로 끝나야 .

 

[Android] SMS 자동으로 읽어오기

SMS 인증번호를 읽어와 자동 입력하기 2018년 10월에 구글에서 공지한 '통화 기록 및 SMS 사용 권한 제한'에 따라 2019년 1월부터 '통화 기록 및 SMS 사용 권한 제한' 정책은 전화나 문자를 주 기능으로

linitial.tistory.com

 


gradle 추가 

implementation 'com.google.android.gms:play-services-auth:20.2.0'
implementation 'com.google.android.gms:play-services-auth-api-phone:18.0.1'

 
 
 
 
인증번호 버튼 클릭시 

    public void startSmsRetriever() {
        try {
            Task<Void> task = SmsRetriever.getClient(MainActivity.this)
                    .startSmsRetriever();

            task.addOnSuccessListener(aVoid ->
                    Log.d("smss", "onSuccess " + MainActivity.this.getAppSignatures(MainActivity.this))
            );

            task.addOnFailureListener(e ->
                    Log.e("smss", "onFailure" + e)
            );

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 
 
서버로 전송할 해쉬값 구하기 

    private final String HASH_TYPE = "SHA-256";
    private final int NUM_HASHED_BYTES = 9;
    private final int NUM_BASE64_CHAR = 11;
    
    ..
    ..
    
    
    @NotNull
    public final ArrayList<String> getAppSignatures(@NotNull Context context) {
        ArrayList<String> appCodes = new ArrayList<>();

        try {
            String packageName = context.getPackageName();
            PackageManager packageManager = context.getPackageManager();
            Signature[] signatures = packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES).signatures;

            for (Signature signature : signatures) {
                String hash = getHash(packageName, signature.toCharsString());
                if (hash != null) {
                    appCodes.add(String.format("%s", hash));
                }

                Log.d("==ss ", String.format("문자 마지막에 붙는 해쉬값 : %s", hash));
            }

        } catch (PackageManager.NameNotFoundException var14) {
        }

        return appCodes;
    }

    private String getHash(String packageName, String signature) {
        String appInfo = packageName + ' ' + signature;

        try {
            MessageDigest messageDigest = MessageDigest.getInstance(HASH_TYPE);
            messageDigest.update(appInfo.getBytes(StandardCharsets.UTF_8));

            byte[] hashSignature = Arrays.copyOfRange(messageDigest.digest(), 0, NUM_HASHED_BYTES);
            String base64Hash = Base64
                    .encodeToString(hashSignature, Base64.NO_PADDING|Base64.NO_WRAP)
                    .substring(0, NUM_BASE64_CHAR);

            return base64Hash;

        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

 
 
sms 리시버 클래스 생성

 public static class MysmsReceiver extends BroadcastReceiver {

        private static final String TAG = "==smsReceiver";
        public MysmsReceiver(){}

        @Override public void onReceive(Context context, Intent intent) {
            Log.e(TAG, "onReceive: ");
            if(intent == null) {
                return;
            }

            if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) {
                Bundle extras = intent.getExtras();
                Status mStatus = (Status) extras.get(SmsRetriever.EXTRA_STATUS);

                switch (mStatus.getStatusCode()) {
                    case CommonStatusCodes.SUCCESS:
                        String message = (String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE);
                        Log.e(TAG, "onReceive: "+ message);
                        Toast.makeText(context, message , Toast.LENGTH_SHORT).show();
                        // 문자값 처리 로직 
                        ((MainActivity)MainActivity.mContext).showMessage(message);

                        break;
                    case CommonStatusCodes.TIMEOUT:
                        Log.e(TAG, "onReceive: failure");
                        break;
                }
            }
        }
    }

 
 
sms 리시버 클래스 MainActivity, Manifest에 등록

    private final MainActivity.MysmsReceiver smsReceiver = new MysmsReceiver();

.
.
 .
   @Override
    protected void onResume() {
        super.onResume();
        IntentFilter smsIntent = new IntentFilter();
        smsIntent.addAction(SmsRetriever.SMS_RETRIEVED_ACTION);
        registerReceiver(smsReceiver, smsIntent);
    }

    @Override
    protected void onDestroy() {
        unregisterReceiver(smsReceiver);
        super.onDestroy();
    }
 <receiver
            android:name=".MainActivity$MysmsReceiver"
            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>

 


 

SMS Retriever API를 사용한 자동 SMS 인증     |  Credential Verification  |  Google Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. Switch to English 의견 보내기 SMS Retriever API를 사용한 자동 SMS 인증 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분

developers.google.com

 
 

반응형

댓글