Halaman ini menjelaskan cara menggunakan SMS User Consent API untuk meminta izin pengguna untuk membaca satu pesan verifikasi SMS. Jika pengguna mengizinkan, API akan menampilkan teks dari pesan, dari mana Anda bisa mendapatkan kode verifikasi dan menyelesaikan proses verifikasi.
Menginstal dependensi
Sertakan komponen autentikasi Layanan Play di file build.gradle
aplikasi Anda:
implementation 'com.google.android.gms:play-services-auth:17.0.0'
implementation 'com.google.android.gms:play-services-auth-api-phone:17.4.0'
1. Mendapatkan nomor telepon pengguna
Jika Anda tidak memiliki nomor telepon pengguna, minta nomor tersebut sebelum memulai SMS alur verifikasi.
Anda bisa mendapatkan nomor telepon pengguna dengan cara yang sesuai dengan . Pertimbangkan untuk menggunakan Smart Lock untuk pemilih petunjuk Sandi untuk membantu pengguna mengisi nomor telepon mereka jika informasi tersebut tidak diperlukan untuk membuat akun pengguna. Untuk menggunakan pemilih petunjuk:
Kotlin
private val CREDENTIAL_PICKER_REQUEST = 1 // Set to an unused request code
// Construct a request for phone numbers and show the picker
private fun requestHint() {
val hintRequest = HintRequest.Builder()
.setPhoneNumberIdentifierSupported(true)
.build()
val credentialsClient = Credentials.getClient(this)
val intent = credentialsClient.getHintPickerIntent(hintRequest)
startIntentSenderForResult(
intent.intentSender,
CREDENTIAL_PICKER_REQUEST,
null, 0, 0, 0
)
}
public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
CREDENTIAL_PICKER_REQUEST ->
// Obtain the phone number from the result
if (resultCode == Activity.RESULT_OK && data != null) {
val credential = data.getParcelableExtra<Credential>(Credential.EXTRA_KEY)
// credential.getId(); <-- will need to process phone number string
}
// ...
}
}
Java
private static final int CREDENTIAL_PICKER_REQUEST = 1; // Set to an unused request code
// Construct a request for phone numbers and show the picker
private void requestHint() throws IntentSender.SendIntentException {
HintRequest hintRequest = new HintRequest.Builder()
.setPhoneNumberIdentifierSupported(true)
.build();
PendingIntent intent = Credentials.getClient(this).getHintPickerIntent(hintRequest);
startIntentSenderForResult(intent.getIntentSender(),
RESOLVE_HINT, null, 0, 0, 0);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case CREDENTIAL_PICKER_REQUEST:
// Obtain the phone number from the result
if (resultCode == RESULT_OK) {
Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
// credential.getId(); <-- will need to process phone number string
}
break;
// ...
}
}
2. Mulai memproses pesan masuk
Selanjutnya, panggil metode startSmsUserConsent()
SMS User Consent API untuk memulai
mendengarkan pesan masuk. Jika Anda mengetahui nomor telepon pengirim SMS
asal pesan, tentukan pesan tersebut (jika tidak, teruskan null
). Dengan cara ini, SMS
User Consent API hanya akan dipicu pada pesan dari nomor ini.
Untuk mulai mendengarkan:
Kotlin
// Start listening for SMS User Consent broadcasts from senderPhoneNumber
// The Task<Void> will be successful if SmsRetriever was able to start
// SMS User Consent, and will error if there was an error starting.
val task = SmsRetriever.getClient(context).startSmsUserConsent(senderPhoneNumber /* or null */)
Java
// Start listening for SMS User Consent broadcasts from senderPhoneNumber
// The Task<Void> will be successful if SmsRetriever was able to start
// SMS User Consent, and will error if there was an error starting.
Task<Void> task = SmsRetriever.getClient(context).startSmsUserConsent(senderPhoneNumber /* or null */);
Setelah Anda mendengarkan pesan SMS masuk, Anda dapat meminta verifikasi mengirim kode verifikasi ke nomor telepon pengguna, yang telah Anda untuk langkah pertama.
Selama lima menit ke depan, ketika perangkat menerima pesan SMS yang berisi kode sekali pakai, layanan Play akan menyiarkan ke aplikasi Anda intent untuk meminta pengguna untuk mendapatkan izin untuk membaca pesan. Sebuah pesan memicu siaran hanya jika memenuhi kriteria berikut:
- Pesan berisi string alfanumerik 4-10 karakter dengan minimal satu karakter angka
- Jika Anda menyebutkan nomor telepon pengirim, pesan akan dikirim olehnya angka
Tangani siaran ini dengan penerima siaran yang memiliki SEND_PERMISSION
izin dan merespons intent SMS_RETRIEVED_ACTION
. Untuk membuat dan
daftarkan penerima siaran:
Kotlin
private val SMS_CONSENT_REQUEST = 2 // Set to an unused request code
private val smsVerificationReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (SmsRetriever.SMS_RETRIEVED_ACTION == intent.action) {
val extras = intent.extras
val smsRetrieverStatus = extras?.get(SmsRetriever.EXTRA_STATUS) as Status
when (smsRetrieverStatus.statusCode) {
CommonStatusCodes.SUCCESS -> {
// Get consent intent
val consentIntent = extras.getParcelable<Intent>(SmsRetriever.EXTRA_CONSENT_INTENT)
try {
// Start activity to show consent dialog to user, activity must be started in
// 5 minutes, otherwise you'll receive another TIMEOUT intent
startActivityForResult(consentIntent, SMS_CONSENT_REQUEST)
} catch (e: ActivityNotFoundException) {
// Handle the exception ...
}
}
CommonStatusCodes.TIMEOUT -> {
// Time out occurred, handle the error.
}
}
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
// ...
val intentFilter = IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION)
registerReceiver(smsVerificationReceiver, SmsRetriever.SEND_PERMISSION, intentFilter)
}
Java
private static final int SMS_CONSENT_REQUEST = 2; // Set to an unused request code
private final BroadcastReceiver smsVerificationReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) {
Bundle extras = intent.getExtras();
Status smsRetrieverStatus = (Status) extras.get(SmsRetriever.EXTRA_STATUS);
switch (smsRetrieverStatus.getStatusCode()) {
case CommonStatusCodes.SUCCESS:
// Get consent intent
Intent consentIntent = extras.getParcelable(SmsRetriever.EXTRA_CONSENT_INTENT);
try {
// Start activity to show consent dialog to user, activity must be started in
// 5 minutes, otherwise you'll receive another TIMEOUT intent
startActivityForResult(consentIntent, SMS_CONSENT_REQUEST);
} catch (ActivityNotFoundException e) {
// Handle the exception ...
}
break;
case CommonStatusCodes.TIMEOUT:
// Time out occurred, handle the error.
break;
}
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ...
IntentFilter intentFilter = new IntentFilter(SmsRetriever.SMS_RETRIEVED_ACTION);
registerReceiver(smsVerificationReceiver, SmsRetriever.SEND_PERMISSION, intentFilter);
}
Dengan memulai aktivitas untuk EXTRA_CONSENT_INTENT
, Anda meminta pengguna untuk
izin satu kali untuk
membaca isi pesan.
3. Dapatkan kode verifikasi dari pesan
Dalam metode onActivityResult()
, tangani respons pengguna terhadap permintaan Anda
untuk izin akses. Jika Anda mendapatkan kode hasil RESULT_OK
, pengguna mengizinkan
izin untuk membaca isi pesan, dan
Anda bisa mendapatkan teks pesan
dari intent.
Kotlin
public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
// ...
SMS_CONSENT_REQUEST ->
// Obtain the phone number from the result
if (resultCode == Activity.RESULT_OK && data != null) {
// Get SMS message content
val message = data.getStringExtra(SmsRetriever.EXTRA_SMS_MESSAGE)
// Extract one-time code from the message and complete verification
// `message` contains the entire text of the SMS message, so you will need
// to parse the string.
val oneTimeCode = parseOneTimeCode(message) // define this function
// send one time code to the server
} else {
// Consent denied. User can type OTC manually.
}
}
}
Java
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
// ...
case SMS_CONSENT_REQUEST:
if (resultCode == RESULT_OK) {
// Get SMS message content
String message = data.getStringExtra(SmsRetriever.EXTRA_SMS_MESSAGE);
// Extract one-time code from the message and complete verification
// `sms` contains the entire text of the SMS message, so you will need
// to parse the string.
String oneTimeCode = parseOneTimeCode(message); // define this function
// send one time code to the server
} else {
// Consent canceled, handle the error ...
}
break;
}
}
Setelah Anda memiliki teks pesan, Anda dapat mengurai kode verifikasi dan mengisi otomatis formulir atau menyelesaikan alur verifikasi.