Help us understand the problem. What is going on with this article?

GoogleSignIn実装

More than 3 years have passed since last update.

はじめに

社内のサービスにGoogleSign実装したので、軽くメモ用に書いてみた。

前提条件

Google Play Storeを含むAndroid 2.3以上

実装準備

google-services.jsonをダウンロード、appの直下に置く

Google Play Servicesを追加する

apply plugin: 'com.android.application'
    ...

    dependencies {
        compile 'com.google.android.gms:play-services-auth:9.8.0'
    }

OAuth 2.0 clientIDを作成する

ここに書いたとおり実行すれば問題ないはず
https://developers.google.com/identity/sign-in/android/start-integrating

■ Step 1:新しい認証情報を作成

スクリーンショット 2017-04-30 14.50.18.png

■ Step 2:クライアント情報を記入

スクリーンショット 2017-04-30 14.50.29.png

※ 本番環境用の認証情報ならRelease用のkey_storeを使ったフィンガープリントではないとだめ

※ 複数のテスト環境ならそれぞれの環境に対応する認証情報を作る必要があり、パッケージ名をちゃんと記入しないとだめ。例: jp.kanlin.test.st1.dev

実装

■Googleサインヘルパークラス実装

ViewのOnClickListenerをimplementするGoogleSignInHelperクラスを実装する

GoogleSignInHelper.java
    public GoogleSignInHelper(Fragment fragment) {
        this.fragment = fragment;
        GoogleSignInOptions googleSignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestEmail()
                .build();

        googleApiClient = new GoogleApiClient.Builder(fragment.getContext())
                .enableAutoManage(this.getFragment().getActivity(), this)
                .addApi(Auth.GOOGLE_SIGN_IN_API, googleSignInOptions)
                .build();
    }

■ヘルパークラスを使ってGoogleサインインを行う

使用したいクラスでインスタンス作って、利用する

  if (googleSignInHelper == null) {
     googleSignInHelper = new GoogleSignInHelper(this);
  }

※ nullチェック入れないとクラッシュが起こる

      if (!PackageUtil.isGooglePlayServicesAvailable(getContext())) {
            binding.googleLogin.setVisibility(View.GONE);
        }

        binding.googleLogin.setOnClickListener(googleSignInHelper);

※ Googleサインインの前提はGooglePlayServicesが端末に入ってることなので、チェックしたほうが良い

  if (requestCode == GoogleSignInHelper.REQUEST_CODE_GOOGLE_SIGN_IN && 
      resultCode == Activity.RESULT_OK) {
            GoogleSignInResult googleSignInResult = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
            handleGoogleSignInResult(googleSignInResult.getSignInAccount());
        }

handleGoogleSignInResultメソッドの中にAPI通信入れて、ログイン処理を行う

ハマったこと

API側で認証失敗したら、再度GoogleSignInを起動して、他のアカウントが選択できるように、Intentを飛ばす前に既にGoogleApiClientに接続かつAPI認証失敗という条件でチェックを入れる必要がある

    private void signInGoogle() {
        Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleApiClient);

        if (googleApiClient.hasConnectedApi(Auth.GOOGLE_SIGN_IN_API) && googleLoginFailed) {
            googleApiClient.clearDefaultAccountAndReconnect();
        }

        fragment.startActivityForResult(signInIntent, REQUEST_CODE_GOOGLE_SIGN_IN);
    }

終わりに

実際にできたのはこんな感じ

485251b3-ad93-dfdd-984f-888ca4d00375.png

33eae60f-49cf-6add-a31c-71708549fd8f.png

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away