Wenn Sie Telefonnummern automatisch bestätigen möchten, müssen Sie sowohl den Client- als auch den Serverteil des Bestätigungsvorgangs implementieren. In diesem Dokument wird beschrieben, wie Sie den Clientteil in einer Android-App implementieren.
Wenn Sie die Bestätigung der Telefonnummer in einer Android-App starten möchten, senden Sie die Telefonnummer an Ihren Bestätigungsserver und rufen Sie die SMS Retriever API auf, um auf eine SMS mit einem Einmalcode für Ihre App zu warten. Nachdem Sie die Nachricht erhalten haben, senden Sie den Einmalcode zurück an Ihren Server, um den Bestätigungsvorgang abzuschließen.
Hinweis
Führen Sie die Schritte in den folgenden Abschnitten aus, um Ihre App vorzubereiten.
Voraussetzungen für Apps
Achten Sie darauf, dass in der Build-Datei Ihrer App die folgenden Werte verwendet werden:
- Eine minSdkVersion von 19 oder höher
- Eine compileSdkVersion von 28 oder höher
Eigene App konfigurieren
Fügen Sie in der build.gradle-Datei auf Projektebene das Maven-Repository von Google und das Maven Central Repository sowohl in den Abschnitten buildscript
als auch allprojects
ein:
buildscript {
repositories {
google()
mavenCentral()
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
Fügen Sie die Abhängigkeit von Google Play-Diensten für die SMS Retriever API der Gradle-Build-Datei Ihres Moduls hinzu, die in der Regel app/build.gradle
lautet:
dependencies {
implementation 'com.google.android.gms:play-services-auth:21.3.0'
implementation 'com.google.android.gms:play-services-auth-api-phone:18.1.0'
}
1. Telefonnummer des Nutzers abrufen
Sie können die Telefonnummer des Nutzers auf jede für Ihre App geeignete Weise abrufen. Oft ist es am besten, die Auswahlhilfe zu verwenden, um den Nutzer aufzufordern, eine der auf dem Gerät gespeicherten Telefonnummern auszuwählen, damit er nicht manuell eine Telefonnummer eingeben muss. So verwenden Sie die Auswahl für Hinweise:
// Construct a request for phone numbers and show the picker
private void requestHint() {
HintRequest hintRequest = new HintRequest.Builder()
.setPhoneNumberIdentifierSupported(true)
.build();
PendingIntent intent = Auth.CredentialsApi.getHintPickerIntent(
apiClient, hintRequest);
startIntentSenderForResult(intent.getIntentSender(),
RESOLVE_HINT, null, 0, 0, 0);
}
// Obtain the phone number from the result
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESOLVE_HINT) {
if (resultCode == RESULT_OK) {
Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
// credential.getId(); <-- will need to process phone number string
}
}
}
2. SMS-Retrieval starten
Wenn Sie die Telefonnummer des Nutzers bestätigen möchten, rufen Sie eine Instanz des SmsRetrieverClient
-Objekts ab, rufen Sie startSmsRetriever
auf und hängen Sie der Aufgabe zum Abrufen von SMS Erfolgs- und Fehler-Listener an:
// Get an instance of SmsRetrieverClient, used to start listening for a matching
// SMS message.
SmsRetrieverClient client = SmsRetriever.getClient(this /* context */);
// Starts SmsRetriever, which waits for ONE matching SMS message until timeout
// (5 minutes). The matching SMS message will be sent via a Broadcast Intent with
// action SmsRetriever#SMS_RETRIEVED_ACTION.
Task<Void> task = client.startSmsRetriever();
// Listen for success/failure of the start Task. If in a background thread, this
// can be made blocking using Tasks.await(task, [timeout]);
task.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
// Successfully started retriever, expect broadcast intent
// ...
}
});
task.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Failed to start retriever, inspect Exception for more details
// ...
}
});
Die Aufgabe zum Abrufen von SMS wartet bis zu fünf Minuten auf eine SMS, die einen eindeutigen String enthält, der Ihre App identifiziert.
3. Telefonnummer an Ihren Server senden
Nachdem Sie die Telefonnummer des Nutzers erhalten und mit dem Abhören von SMS-Nachrichten begonnen haben, senden Sie die Telefonnummer des Nutzers mit einer beliebigen Methode (in der Regel mit einer HTTPS-POST-Anfrage) an Ihren Bestätigungsserver.
Ihr Server generiert eine Bestätigungsnachricht und sendet sie per SMS an die von Ihnen angegebene Telefonnummer. Weitere Informationen finden Sie unter SMS-Bestätigung auf dem Server ausführen.
4. Bestätigungsnachrichten erhalten
Wenn auf dem Gerät des Nutzers eine Bestätigungsnachricht empfangen wird, senden die Play-Dienste explizit eine SmsRetriever.SMS_RETRIEVED_ACTION
-Intent an Ihre App, die den Text der Nachricht enthält. Verwenden Sie ein BroadcastReceiver
, um diese Bestätigungsnachricht zu erhalten.
Rufen Sie im onReceive
-Handler von BroadcastReceiver
den Text der Bestätigungsnachricht (und optional die Absenderadresse) aus den Extras des Intents ab:
/**
* BroadcastReceiver to wait for SMS messages. This can be registered either
* in the AndroidManifest or at runtime. Should filter Intents on
* SmsRetriever.SMS_RETRIEVED_ACTION.
*/
public class MySMSBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) {
Bundle extras = intent.getExtras();
Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS);
switch(status.getStatusCode()) {
case CommonStatusCodes.SUCCESS:
// (Optional) Get SMS Sender address - only available in
// GMS version 24.20 onwards, else it will return null
String senderAddress = extras.getString(SmsRetriever.EXTRA_SMS_ORIGINATING_ADDRESS);
// Get SMS message contents
String message = extras.getString(SmsRetriever.EXTRA_SMS_MESSAGE);
// Extract one-time code from the message and complete verification
// by sending the code back to your server.
break;
case CommonStatusCodes.TIMEOUT:
// Waiting for SMS timed out (5 minutes)
// Handle the error ...
break;
}
}
}
}
Registrieren Sie diese BroadcastReceiver
mit dem Intent-Filter com.google.android.gms.auth.api.phone.SMS_RETRIEVED
(Wert der Konstante SmsRetriever.SMS_RETRIEVED_ACTION
) und der Berechtigung com.google.android.gms.auth.api.phone.permission.SEND
(Wert der Konstante SmsRetriever.SEND_PERMISSION
) in der Datei AndroidManifest.xml
Ihrer App, wie im folgenden Beispiel, oder dynamisch mit Context.registerReceiver
.
<receiver android:name=".MySMSBroadcastReceiver" android:exported="true"
android:permission="com.google.android.gms.auth.api.phone.permission.SEND">
<intent-filter>
<action android:name="com.google.android.gms.auth.api.phone.SMS_RETRIEVED"/>
</intent-filter>
</receiver>
5. Senden Sie den Einmalcode aus der Bestätigungsnachricht an Ihren Server.
Nachdem Sie den Text der Bestätigungsnachricht haben, verwenden Sie einen regulären Ausdruck oder eine andere Logik, um den Einmalcode aus der Nachricht zu extrahieren. Das Format des Einmalcodes hängt davon ab, wie Sie ihn auf Ihrem Server implementiert haben.
Senden Sie den Einmalcode schließlich über eine sichere Verbindung an Ihren Server. Wenn Ihr Server den Einmalcode empfängt, wird vermerkt, dass die Telefonnummer bestätigt wurde.