หน้านี้อธิบายวิธีใช้ SMS User Consent API เพื่อขอความยินยอมจากผู้ใช้ ในการอ่านข้อความยืนยันทาง SMS รายการเดียว หากผู้ใช้ให้ความยินยอม API จะแสดงข้อความ ซึ่งคุณสามารถรับรหัสยืนยันและ ทําขั้นตอนการยืนยันให้เสร็จสมบูรณ์ได้
ติดตั้งการอ้างอิง
รวมคอมโพเนนต์การตรวจสอบสิทธิ์ของบริการ Google Play ไว้ในไฟล์ build.gradle ของแอป
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. รับหมายเลขโทรศัพท์ของผู้ใช้
หากไม่มีหมายเลขโทรศัพท์ของผู้ใช้ ให้ขอหมายเลขดังกล่าวก่อนเริ่มขั้นตอนการยืนยันทาง SMS
คุณขอหมายเลขโทรศัพท์ของผู้ใช้ได้ในลักษณะที่เหมาะสมกับแอปของคุณ ลองใช้ตัวเลือกคำแนะนำของ Smart Lock สำหรับรหัสผ่าน เพื่อช่วยให้ผู้ใช้กรอกหมายเลขโทรศัพท์หากไม่จำเป็นต้องใช้ข้อมูลดังกล่าวในการสร้างบัญชีของผู้ใช้ วิธีใช้ตัวเลือกคำใบ้
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. เริ่มฟังข้อความขาเข้า
จากนั้นเรียกใช้เมธอด startSmsUserConsent() ของ SMS User Consent API เพื่อเริ่ม
ฟังข้อความขาเข้า หากทราบหมายเลขโทรศัพท์ที่จะส่งข้อความ SMS ให้ระบุหมายเลขนั้น (หากไม่ทราบ ให้ส่ง null) วิธีนี้จะทำให้ SMS User Consent API ทริกเกอร์เฉพาะข้อความจากหมายเลขนี้
วิธีเริ่มฟัง
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 */);
เมื่อพร้อมรับฟังข้อความ SMS ที่เข้ามาแล้ว คุณสามารถให้ระบบยืนยันส่งรหัสยืนยันไปยังหมายเลขโทรศัพท์ของผู้ใช้ซึ่งคุณได้รับในขั้นตอนแรก
ในอีก 5 นาทีข้างหน้า เมื่ออุปกรณ์ได้รับข้อความ SMS ที่มีรหัสแบบใช้ครั้งเดียว บริการ Play จะออกอากาศ Intent ไปยังแอปของคุณเพื่อแจ้งให้ผู้ใช้ขอสิทธิ์อ่านข้อความ ข้อความจะทริกเกอร์การออกอากาศ ก็ต่อเมื่อตรงตามเกณฑ์ต่อไปนี้
- ข้อความมีสตริงตัวอักษรและตัวเลข 4-10 ตัวที่มีตัวเลขอย่างน้อย 1 ตัว
- หากคุณระบุหมายเลขโทรศัพท์ของผู้ส่ง ข้อความจะถูกส่งจากหมายเลขนั้น
จัดการการออกอากาศเหล่านี้ด้วย Broadcast Receiver ที่มีSEND_PERMISSION
สิทธิ์และตอบสนองต่อ Intent ของ SMS_RETRIEVED_ACTION วิธีสร้างและ
ลงทะเบียน Broadcast Receiver
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 จะเป็นการแจ้งให้ผู้ใช้ขอสิทธิ์ครั้งเดียวเพื่ออ่านเนื้อหาของข้อความ
3. รับรหัสยืนยันจากข้อความ
ในonActivityResult()วิธีนี้ ให้จัดการการตอบกลับของผู้ใช้ต่อคำขอสิทธิ์
ของคุณ หากได้รับรหัสผลลัพธ์เป็น RESULT_OK แสดงว่าผู้ใช้ให้สิทธิ์
อ่านเนื้อหาของข้อความ และคุณสามารถรับข้อความ
จาก 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;
}
}
เมื่อได้ข้อความแล้ว คุณจะแยกวิเคราะห์รหัสยืนยันและ ป้อนแบบฟอร์มอัตโนมัติ หรือดำเนินการตามขั้นตอนการยืนยันให้เสร็จสมบูรณ์ได้