電話番号を自動的に確認するには、確認フローのクライアント部分とサーバー部分の両方を実装する必要があります。このドキュメントでは、Android アプリにクライアント部分を実装する方法について説明します。
Android アプリで電話番号の確認フローを開始するには、確認サーバーに電話番号を送信し、SMS Retriever API を呼び出してアプリのワンタイム コードを含む SMS メッセージのリッスンを開始します。メッセージを受信したら、そのワンタイム コードをサーバーに送信して確認プロセスを完了します。
始める前に
アプリを準備するには、以下のセクションに示す手順を完了します。
アプリの前提条件
アプリのビルドファイルで次の値が使用されていることを確認します。
- 19 以上の minSdkVersion
- 28 以上の compileSdkVersion
アプリを設定する
プロジェクト レベルの build.gradle ファイルで、buildscript
セクションと allprojects
セクションの両方に Google の Maven リポジトリと Maven セントラル リポジトリを含めます。
buildscript {
repositories {
google()
mavenCentral()
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
モジュールの Gradle ビルドファイル(通常は app/build.gradle
)に SMS Retriever API の Google Play 開発者サービスの依存関係を追加します。
dependencies {
implementation 'com.google.android.gms:play-services-auth:21.2.0'
implementation 'com.google.android.gms:play-services-auth-api-phone:18.1.0'
}
1. ユーザーの電話番号を取得する
ユーザーの電話番号は、アプリに適した方法で取得できます。多くの場合、最適なユーザー エクスペリエンスは、ヒント選択ツールを使用して、デバイスに保存されている電話番号から選択するようユーザーに促すことです。これにより、電話番号を手動で入力する必要がなくなります。ヒント選択ツールを使用するには:
// 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 Retriever を起動する
ユーザーの電話番号を確認する準備ができたら、SmsRetrieverClient
オブジェクトのインスタンスを取得して startSmsRetriever
を呼び出し、成功リスナーと失敗リスナーを SMS 取得タスクにアタッチします。
// 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
// ...
}
});
SMS 取得タスクは、アプリを識別する一意の文字列を含む SMS メッセージを最大 5 分間リッスンします。
3. 電話番号をサーバーに送信する
ユーザーの電話番号を取得して SMS メッセージのリッスンを開始したら、任意の方法(通常は HTTPS POST リクエストを使用)を使用してユーザーの電話番号を検証サーバーに送信します。
サーバーが確認メッセージを生成し、指定された電話番号に SMS で送信します。サーバーで SMS 検証を実行するをご覧ください。
4. 確認メッセージを受信する
ユーザーのデバイスで確認メッセージを受信すると、Play 開発者サービスはメッセージのテキストを含む SmsRetriever.SMS_RETRIEVED_ACTION
インテントを明示的にアプリにブロードキャストします。この確認メッセージを受信するには、BroadcastReceiver
を使用します。
BroadcastReceiver
の onReceive
ハンドラで、インテントのエクストラから確認メッセージのテキスト(および必要に応じて送信者アドレス)を取得します。
/**
* 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;
}
}
}
}
アプリの AndroidManifest.xml
ファイル内で、インテント フィルタ com.google.android.gms.auth.api.phone.SMS_RETRIEVED
(SmsRetriever.SMS_RETRIEVED_ACTION
定数の値)と権限 com.google.android.gms.auth.api.phone.permission.SEND
(SmsRetriever.SEND_PERMISSION
定数の値)を使用して、次の例に示すように、または動的に Context.registerReceiver
を使用して、この BroadcastReceiver
を登録します。
<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. 確認メッセージに含まれているワンタイム コードをサーバーに送信する
確認メッセージのテキストを取得したら、正規表現やその他のロジックを使用して、メッセージからワンタイム コードを取得します。ワンタイム コードの形式は、サーバーでの実装方法によって異なります。
最後に、安全な接続を介して、ワンタイム コードをサーバーに送信します。サーバーがワンタイム コードを受信すると、電話番号の確認が完了したことが記録されます。