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

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

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