목차
구글 플레이에서 별도 승인되지 않은 앱은 SMS권한을 제거하도록 변경됐습니다. SMS권한을 이용하여 메시지를 읽는 앱의 경우에는 빠르게 조치를 취해야 했습니다. 이에 따라 구글은 앱에서 SMS권한 요구없이 SMS내용을 읽을 수 있도록 하는 API를 공개했습니다. 이번 포스팅에서는 SMS Retriever API의 사용법을 알아보겠습니다.
class MainActivity : AppCompatActivity() {
private lateinit var client: SmsRetrieverClient
private var smsRetrieverReceiver: BroadcastReceiver? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
registerSmsRetrieverReceiver()
client = SmsRetriever.getClient(this).also {
it.startSmsRetriever() // 준비가 되면 SMS Retriever를 시작시켜준다.
// 인증코드 재전송시에 재호출해주어야 한다.
}
}
override fun onDestroy() {
unregisterSmsRetrieverReceiver()
super.onDestroy()
}
private fun registerSmsRetrieverReceiver() {
smsRetrieverReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (SmsRetriever.SMS_RETRIEVED_ACTION != intent.action) {
return
}
val extras = intent.extras ?: return
val status = extras.get(SmsRetriever.EXTRA_STATUS) as? Status ?: return
if (status.statusCode != CommonStatusCodes.SUCCESS) {
return
}
val message = extras.get(SmsRetriever.EXTRA_SMS_MESSAGE)
}
}
registerReceiver(smsRetrieverReceiver, IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION))
}
private fun unregisterSmsRetrieverReceiver() {
if (smsRetrieverReceiver != null) {
unregisterReceiver(smsRetrieverReceiver)
smsRetrieverReceiver = null
}
}
}
Android 클라이언트에서는 위의 코드로 준비가 끝납니다. 이제 특정 형식을 지킨 메시지가 앱에 수신되면 코드에서 message를 읽어올 수 있습니다.
SMS Retriever API를 이용하여 메시지를 읽기 위해서 메시지 구성형식을 제한했습니다.
<#> 로 시작해야 한다.
메시지 내용은 140바이트 이하여야 한다.
앱을 식별하는 11자리 해시 문자열로 끝나야 한다.
ex)
<#>
인증번호는 [1234] 입니다.
Kr12Qo0VGAq
참고로 `[Web발신] <#>`으로 시작되는 문자는 허용되나 `[국제발신] <#>`으로 시작되는 문자는 SMS Retriever API가 동작하지 않습니다.
11자리 Hash 문자열 구하기
아래의 명령어로 구하여 복사해서 사용하세요. Keyalias, Keystore경로, Package명은 알맞게 수정하여 사용하세요
> keytool -exportcert -alias AndroidDebugKey -keystore '/Users/jerome/.android/debug.keystore' | xxd -p | tr -d "[:space:]" | echo -n com.jerome.android.smsretrieverexample \`cat\` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11
만약 bash: sha256sum: command not found
가 나타난다면 아래의 명령어로 프로그램을 설치 후 명령을 재실행해주세요.
> brew install coreutils
Keystore 정보 읽어오기
Gradle -> [ProjectName] -> app -> Tasks -> android -> signingReport
위 경로의 Task를 실행하면 Variant별로 Keystore정보가 출력됩니다.
[Android] Identifiers must have user defined types from the XML file. (0) | 2019.12.10 |
---|---|
[Android] Kotlin Parcelize 등장 - Serializable vs Parcelable (0) | 2019.12.08 |
구글 플레이스토어 앱 업로드 후 '게시 보류 중' 이 지속된다 (4) | 2019.10.19 |
구글 플레이 개발자 계정 등록하기 (0) | 2019.10.01 |
Android 볼륨 업/다운 키 받아서 미디어 볼륨 조정하기 (0) | 2019.09.19 |