Android端末に登録済みのGoogleアカウントでOAuth
移転しました →
Android触り始めています。Androidでは端末にGoogleのアカウントを登録でき、アプリでは端末に登録済みのアカウントを使ってGoogleの各種サービスと連携することができるため、ユーザーに改めてログインを求める必要がありません。
ということで色々調べてサンプル的に実装し始めたのですが、全然まとまった情報がなくて超困りました。iOSでGoogleAPIのことを調べていたときもそうだったんですが、GoogleのAPI周りの情報はすごくわかりづらいですね。MicrsoftのMSDNを読んでいるような感じがしました、っていうと言い過ぎか。
なお、Android Studioでの話です。
サンプルを探す
まずはサンプルを探しました。で、Javaのクライアントのドキュメントに簡単そうに見えるサンプルがあったのでこれ(↓)を試そうと思ったんですが、すでにインターフェース変わっていて使えませんでした!ちくしょー
気を取り直して最新と思われるものを探したら、これが見つかりました。
Mercurialで管理されているソースコードです。一式cloneしておくとよさそうなので、次のコマンドでローカルに持ってきます。
% hg clone https://code.google.com/p/google-api-java-client.samples/ google-api-java-client-samples
プロジェクトを作る
Androidに慣れていないこともあって、ダウンロードしてきたサンプルコードがそのまま動かなくてハマることが多々ありました。新規プロジェクトを作り、サンプルコードを参考に必要な部分を書いていくことにします。
参考にしたのは、tasks-android-sample
です。
Google Play services
Google Play servicesという追加のSDKを入れる必要があります。
google-api-java-client
依存していそうなライブラリを全部入れておきましょう。本番では不要なものは外せばいいけど、検証なのでそういう細かいことは無視です。
持ってきたライブラリのjar
ファイルをプロジェクトのlibs
ディレクトリに移動します。
build.gradle
このあたりでgradle
ファイルの中身を確認しとくといいですね。
dependencies { compile 'com.android.support:appcompat-v7:+' compile 'com.google.android.gms:play-services:+' # この行は追記 compile fileTree(dir: 'libs', include: ['*.jar']) # この行があることを確認 }
play-servicesの行を書かなくてビルドで怒られてしまいしばらくはまりました。
実装編
全文はこちら
https://gist.github.com/xoyip/11288689
onCreate
onCreateでは主にAPIの設定を行っています。ついでにボタンのイベントハンドラもここに直で書いています。
この部分がAPIの設定。
mCredential = GoogleAccountCredential.usingOAuth2(this, Collections.singleton(TasksScopes.TASKS)); SharedPreferences settings = getPreferences(Context.MODE_PRIVATE); mCredential.setSelectedAccountName(settings.getString(PREF_ACCOUNT_NAME, null)); service = new Tasks.Builder(mHttpTransport, mJsonFactory, mCredential) .setApplicationName("Google-TasksAndroidSample/1.0").build();
ボタンクリックではchooseAccount
メソッドを呼ぶだけにしています。
onActivityResult
requestCode
などの条件が満たされていたら情報を取り出してきてアカウント名をログに出すってことをしています。これで一応認証が済みました。
if(requestCode == REQUEST_ACCOUNT_PICKER && resultCode == RESULT_OK && data != null && data.getExtras() != null ){ String accountName = data.getExtras().getString(AccountManager.KEY_ACCOUNT_NAME); if(accountName != null){ mCredential.setSelectedAccountName(accountName); SharedPreferences settings = getPreferences(Context.MODE_PRIVATE); SharedPreferences.Editor editor = settings.edit(); editor.putString(PREF_ACCOUNT_NAME, accountName); Log.d(TAG, accountName); } }
次にやるべきこと
実際にサービスから情報を取ってくるところに辿りつくためにはまだわかっていないことがたくさんあります。