Google ログインを Android アプリに統合する

Google ログインを Android アプリに統合するには、Google ログインを設定し、ログインフローを開始するボタンをアプリのレイアウトに追加します。

始める前に

Google API Console プロジェクトを設定し、Android Studio プロジェクトをセットアップする

Google ログインと GoogleSignInClient オブジェクトを構成する

  1. ログイン アクティビティの onCreate メソッドで、アプリで必要なユーザーデータをリクエストするように Google ログインを構成します。たとえば、ユーザーの ID と基本的なプロフィール情報をリクエストするように Google ログインを構成するには、DEFAULT_SIGN_IN パラメータを使用して GoogleSignInOptions オブジェクトを作成します。ユーザーのメールアドレスもリクエストするには、requestEmail オプションを使用して GoogleSignInOptions オブジェクトを作成します。

    // Configure sign-in to request the user's ID, email address, and basic
    // profile. ID and basic profile are included in DEFAULT_SIGN_IN.
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .build();

    Google API にアクセスするための追加のスコープをリクエストする必要がある場合は、requestScopes で指定します。ユーザー エクスペリエンスを最大限に高めるには、ログイン時に、アプリが最低限機能するために必要なスコープのみをリクエストします。追加のスコープは、必要な場合にのみリクエストしてください。そうすることで、ユーザーは、実行したアクションのコンテキストで同意画面を表示できます。スコープの追加をリクエストするをご覧ください。

  2. 次に、ログイン アクティビティの onCreate メソッドでも、指定したオプションを使用して GoogleSignInClient オブジェクトを作成します。

    // Build a GoogleSignInClient with the options specified by gso.
    mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

既存のログイン ユーザーを確認する

アクティビティの onStart メソッドで、ユーザーがすでに Google でアプリにログインしているかどうかを確認します。

// Check for existing Google Sign In account, if the user is already signed in
// the GoogleSignInAccount will be non-null.
GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
updateUI(account);

GoogleSignIn.getLastSignedInAccountnull ではなく GoogleSignInAccount オブジェクトを返す場合、ユーザーはすでに Google でアプリにログインしています。それに応じて UI を更新します。つまり、ログインボタンを非表示にしたり、メイン アクティビティを起動したりします。アプリに適した方法で更新してください。

GoogleSignIn.getLastSignedInAccountnull を返した場合、ユーザーは Google でアプリにログインしていません。Google ログイン ボタンを表示するように UI を更新します。

Google ログインボタンをアプリに追加する

  1. 標準の Google ログインボタン アプリケーションのレイアウトに SignInButton を追加します。

    <com.google.android.gms.common.SignInButton
     android:id="@+id/sign_in_button"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" />
    
  2. 省略可: 独自のログイン ボタンアセットではなく、デフォルトのログイン ボタン グラフィックを使用している場合は、setSize メソッドを使用してボタンのサイズをカスタマイズできます。

    // Set the dimensions of the sign-in button.
    SignInButton signInButton = findViewById(R.id.sign_in_button);
    signInButton.setSize(SignInButton.SIZE_STANDARD);
    
  3. Android のアクティビティ(onCreate メソッド内のアクティビティなど)で、ボタンの OnClickListener を登録し、クリックされたときにユーザーがログインできるようにします。

    findViewById(R.id.sign_in_button).setOnClickListener(this);
    

ログインフローを開始する

  1. ログイン アカウント選択ツールの画像アクティビティの onClick メソッドで、getSignInIntent メソッドでログイン インテントを作成し、startActivityForResult でインテントを開始することにより、ログインボタンのタップを処理します。

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.sign_in_button:
                signIn();
                break;
            // ...
        }
    }
    
    private void signIn() {
        Intent signInIntent = mGoogleSignInClient.getSignInIntent();
        startActivityForResult(signInIntent, RC_SIGN_IN);
    }

    インテントを開始すると、ログインに使用する Google アカウントを選択するようユーザーに求めるメッセージが表示されます。profileemailopenid 以外のスコープをリクエストした場合、ユーザーはそれらのリソースへのアクセスを許可するよう求められます。

  2. ユーザーがログインすると、アクティビティの onActivityResult メソッドでユーザーの GoogleSignInAccount オブジェクトを取得できます。

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
        if (requestCode == RC_SIGN_IN) {
            // The Task returned from this call is always completed, no need to attach
            // a listener.
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            handleSignInResult(task);
        }
    }

    GoogleSignInAccount オブジェクトには、ログイン中のユーザーに関する情報(ユーザー名など)が含まれています。

    private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
        try {
            GoogleSignInAccount account = completedTask.getResult(ApiException.class);
    
            // Signed in successfully, show authenticated UI.
            updateUI(account);
        } catch (ApiException e) {
            // The ApiException status code indicates the detailed failure reason.
            // Please refer to the GoogleSignInStatusCodes class reference for more information.
            Log.w(TAG, "signInResult:failed code=" + e.getStatusCode());
            updateUI(null);
        }
    }

    getEmail を使用してユーザーのメールアドレスを取得したり、getId を使用してユーザーの Google ID(クライアントサイドで使用)を取得したり、getIdToken を使用してユーザーの ID トークンを取得したりすることもできます。現在ログインしているユーザーをバックエンド サーバーにログインさせる必要がある場合は、ID トークンをバックエンド サーバーに送信し、サーバー上でトークンの検証を実行します。