반응형
- 메시지 내용은 <#> 로 시작.
- 메시지 내용은 140 byte 이하.
- 11자리 Hash Key 로 끝나야 .
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>
반응형
'IT > Android' 카테고리의 다른 글
플레이스토어] 출시하고 출시 노트 수정하기 (0) | 2023.03.30 |
---|---|
Android] Postman에서 Fcm 푸쉬 보내기 (0) | 2023.03.16 |
Android] 문자 SMS 읽어오기 (0) | 2023.01.20 |
Android] 안드로이드 웹뷰 디버깅하는 법 (0) | 2022.12.28 |
Android Firebase] fetchAndActivate (0) | 2022.11.21 |
댓글