Android触り始めています。Androidでは端末にGoogleのアカウントを登録でき、アプリでは端末に登録済みのアカウントを使ってGoogleの各種サービスと連携できるため、ユーザーに改めてログインを求める必要がありません。

ということで色々調べてサンプル的に実装し始めたのですが、全然まとまった情報がなくて超困りました。iOSでGoogleAPIのことを調べていたときもそうだったんですが、GoogleのAPI周りの情報はすごくわかりづらいですね。MicrsoftのMSDNを読んでいるような感じがしました、っていうと言い過ぎか。

なお、Android Studioでの話です。

サンプルを探す

まずはサンプルを探しました。で、Javaのクライアントのドキュメントに簡単そうに見えるサンプルがあったのでこれ(↓)を試そうと思ったんですが、すでにインターフェース変わっていて使えませんでした!ちくしょー

OAuth2 - google-api-java-client - OAuth 2.0 - Google APIs Client Library for Java - Google Project Hosting

気を取り直して最新と思われるものを探したら、これが見つかりました。

[https://code.google.com/p/google-api-java-client/source/browse?repo=samples#hg/ / - google-api-java-client - Google APIs Client Library for Java - Google Project Hosting]

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

依存していそうなライブラリを全部入れておきましょう。本番では不要なものは外せばいいけど、検証なのでそういう細かいことは無視です。

Setup - google-api-java-client - Download and Setup instructions - Google APIs Client Library for Java - Google Project Hosting

持ってきたライブラリの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/pi-chan/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);
    }
}

次にやるべきこと

実際にサービスから情報を取ってくるところに辿りつくためにはまだわかっていないことがたくさんあります。

  • 一度認証したらその情報を残せるのか?
  • アクセストークンは?
  • API_KEY使ってないぞ?