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

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

始める前に

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

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

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

    // 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.getLastSignedInAccountGoogleSignInAccount オブジェクトを返す場合 (null ではない)の場合、ユーザーはすでに Google でアプリにログインしています。 必要に応じて UI を更新します。つまり、ログインボタンを非表示にして、 メイン アクティビティなど、アプリに適したものを選択できます。

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

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. 省略可: Google Chat の設定ではなく、デフォルトのログインボタンのグラフィック 独自のログインボタン アセットを提供する場合、ボタンの 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. ユーザーがログインすると、GoogleSignInAccount が表示されます。 アクティビティの onActivityResult メソッドでユーザー用にオブジェクトが用意されています。

    @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 トークンをバックエンド サーバーに送信し、サーバー上でトークンの検証を実行します。