LoginSignup
7
8

More than 5 years have passed since last update.

GoogleSignIn実装

Last updated at Posted at 2017-04-30

はじめに

社内のサービスに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

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8