Google Sign-In
1 Comment
はじめに
社内のサービスにGoogleSignIn実装したので、軽くメモ用に書いてみた。
前提条件
Google Play Storeを含むAndroid 2.3以上
実装準備
google-services.json
をダウンロード、appの直下に置く- Google Play Servicesを追加する
com.android.application
プラグインを適用
1
2
3
|
dependencies {
compile 'com.google.android.gms:play-services-auth:9.8.0'
}
|
OAuth 2.0 clientIDを作成する
ここに書いたとおり実行すれば問題ないはず : start-integrating
■ Step 1:新しい認証情報を作成
■ Step 2:クライアント情報を記入
※ 本番環境用の認証情報ならRelease用のkey_storeを使ったフィンガープリントではないとだめ
※ 複数のテスト環境ならそれぞれの環境に対応する認証情報を作る必要があり、パッケージ名をちゃんと記入しないとだめ。
例: jp.kanlin.test.st1.dev
実装
■ Googleサインヘルパークラス実装
ViewのOnClickListenerをimplementするGoogleSignInHelperクラスを実装する
1
2
3
4
5
6
7
8
9
10
11
|
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サインインを行う
使用したいクラスでインスタンス作って、利用する
1
2
3
4
5
6
7
8
9
|
if (googleSignInHelper == null) { // nullチェック入れないとクラッシュが起こる
googleSignInHelper = new GoogleSignInHelper(this);
}
if (!PackageUtil.isGooglePlayServicesAvailable(getContext())) {
binding.googleLogin.setVisibility(View.GONE);
}
binding.googleLogin.setOnClickListener(googleSignInHelper);
|
※ Googleサインインの前提はGooglePlayServicesが端末に入ってることなので、チェックしたほうが良い
1
2
3
4
5
6
|
// 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を飛ばす前に既にGoogleApiClientに接続かつAPI認証失敗
という条件でチェックを入れる必要がある
1
2
3
4
5
6
7
8
9
|
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);
}
|
終わりに
実際にできたのはこんな感じ