GoogleSignIn実装


## はじめに
社内のサービスに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](https://qiita-image-store.s3.amazonaws.com/0/174676/7920ebdc-1407-b815-7bf2-ea9bf77c6ec4.png "スクリーンショット 2017-04-30 14.50.18.png")

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

![スクリーンショット 2017-04-30 14.50.29.png](https://qiita-image-store.s3.amazonaws.com/0/174676/cdc18842-52f0-5b00-d5a3-77aa9a81a8f6.png "スクリーンショット 2017-04-30 14.50.29.png")

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

<font color=red>※　複数のテスト環境ならそれぞれの環境に対応する認証情報を作る必要があり、パッケージ名をちゃんと記入しないとだめ</font>。例: `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);
  }

```
<font color= Red>※　nullチェック入れないとクラッシュが起こる</font>

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

        binding.googleLogin.setOnClickListener(googleSignInHelper);
        
```
<font color= Red>※　Googleサインインの前提はGooglePlayServicesが端末に入ってることなので、チェックしたほうが良い</font>

``` Googleサインインからのコールバック処理
  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を飛ばす前に<font color=red>既にGoogleApiClientに接続かつAPI認証失敗</font>という条件でチェックを入れる必要がある

```

    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](https://qiita-image-store.s3.amazonaws.com/0/174676/cd9fe094-dc6d-0213-a132-3df7d7cf3086.png "485251b3-ad93-dfdd-984f-888ca4d00375.png")

![33eae60f-49cf-6add-a31c-71708549fd8f.png](https://qiita-image-store.s3.amazonaws.com/0/174676/4424d89c-1076-5db5-994e-056a73bf48fa.png "33eae60f-49cf-6add-a31c-71708549fd8f.png")