Bu sayfada, kullanıcıdan izin istemek için SMS User Consent API'nin nasıl kullanılacağı açıklanmaktadır. tek bir SMS doğrulama mesajını okumak için. Kullanıcı izin verirse API, doğrulama kodunu alabileceğiniz mesaj metnini doğrulama sürecini tamamlayın.
Bağımlıları yükleme
Play Hizmetleri kimlik doğrulama bileşenini, uygulamanızın build.gradle
dosyasına ekleyin:
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. Kullanıcının telefon numarasını alma
Kullanıcının telefon numarası sizde yoksa SMS başlatmadan önce numarayı isteyin doğrulama akışı.
Kullanıcının telefon numarasını sizin için uygun bir şekilde edinebilirsiniz uygulamasını indirin. Şu özelliklerden faydalanabilirsiniz: Şifreler için Smart Lock ipucu seçici telefon numarasını doldurmasına yardımcı olmak (bu bilgi gerekli değilse) (kullanıcının hesabını oluşturmak için). İpucu seçiciyi kullanmak için:
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. Gelen mesajları dinlemeye başlayın
Ardından, başlamak için SMS User Consent API'nin startSmsUserConsent()
yöntemini çağırın
gelen mesajları dinlemektedir. SMS'in gönderildiği telefon numarasını biliyorsanız
mesajının kaynağı olursa bunu belirtin (aksi takdirde null
değerini iletin). Bu şekilde, SMS
User Consent API yalnızca bu numaradan gelen mesajları tetikler.
Dinlemeye başlamak için:
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 */);
Gelen SMS mesajlarını dinledikten sonra, doğrulama doğrulama kodunu kullanıcının telefon numarasına göndermesini isteyebilirsiniz. ilk adımdır.
Sonraki beş dakika boyunca cihaz şunu içeren bir SMS mesajı aldığında: bir defalık kod girerseniz Play Hizmetleri, uygulamanızın kullanıcıdan iletiyi okuma izni alması gerekir. Yayın bir mesaj tarafından tetiklenir yalnızca şu ölçütleri karşılaması durumunda:
- Mesaj, en az bir tane içeren 4-10 karakterlik alfanümerik bir dize içerir sayı.
- Gönderenin telefon numarasını belirttiyseniz mesaj bu numara tarafından gönderilmiştir. sayı.
Bu yayınları, SEND_PERMISSION
özelliğine sahip bir yayın alıcıyla işleyin.
ve SMS_RETRIEVED_ACTION
amaca yanıt verir. Oluşturmak ve
yayın alıcısını kaydedin:
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);
}
EXTRA_CONSENT_INTENT
için bir etkinlik başlattığınızda kullanıcıdan
iletinin içeriğini okumak için tek seferlik izin vermelidir.
3. Mesajla doğrulama kodu alma
onActivityResult()
yönteminde, kullanıcının isteğinize verdiği yanıtı işleme alın
bakın. RESULT_OK
sonuç kodunu alırsanız kullanıcı izin vermiş demektir
içeriğini okuma iznine sahip olursunuz ve bu iznin ardından ileti metnini
çıkarılabilir.
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;
}
}
Mesaj metnini aldıktan sonra doğrulama kodunu ayrıştırabilir ve veya doğrulama akışını tamamlamalıdır.