Android Tips #50 Android Query を使ってサービスの認証処理を超シンプルに実装する

2013.05.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Android Query の紹介記事でよく見かける実装は UI 周りだったり非同期処理だったりしますが API を見てみると他にもいろいろな実装を楽にする API があるようです。 ということで今回は各種サービスの認証の実装が、Android Query ではどのようにシンプルに実装できるのか見てみましょう!

Google Service

Google Service は Google アカウントのさまざまなデータを取得するときに使えます。 Google Service を使うには、まず AndroidManifest.xml に以下のパーミッションを追加しておく必要があります。

AndroidManifest.xml

<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />

Google Contact API (連絡先の API) を使いたい場合は以下のように実装します。

public void getContacts() {
    // Google Contacts API の GoogleHandle インスタンスを生成
    GoogleHandle handle = new GoogleHandle(this, AQuery.AUTH_CONTACTS, AQuery.ACTIVE_ACCOUNT);
    AQuery aq = new AQuery(this);
    // 連絡先を取得
    String url = "http://www.google.com/m8/feeds/contacts/default/full?alt=json";
    aq.auth(handle).ajax(url, String.class, new AjaxCallback<String>() {
        @Override
        public void callback(String url, String object, AjaxStatus status) {
            AQUtility.debug(TAG, object.toString());
        }
    });
}

GoogleHandle クラスを使うところがポイントです。Android Query で認証処理を実装するには Handle というクラスのインスタンスを auth() メソッドに渡して認証します。Google アカウントの認証なので GoogleHandle です。
GoogleHandle のコンストラクタの第二引数に渡している定数はどの API を使うか設定しています。上記サンプルは Google Contact API を呼び出したいので AQuery.AUTH_CONTACTS としています。他に連携できるサービスはこちらを参照してください!

Facebook

Facebook と連携するにはまずこちらで開発者登録とアプリ登録を行い、アプリIDを取得しておく必要があります。あとは Google Service とほぼ同じです。auth() には FacebookHandle を渡します。コンストラクタの第三引数にはパーミッションをカンマ区切りの文字列で渡します。どのようなパーミッションが渡せるかはこちらを参照してください。

private static final String APP_ID = "YOUR_APP_ID";
private static final String PERMISSIONS = "read_stream,read_friendlists";
public void getFeeds() {
    // FacebookHandle のインスタンスを生成
    FacebookHandle handle = new FacebookHandle(this, APP_ID, PERMISSIONS);
    AQuery aq = new AQuery(this);
    // フィードを取得
    String url = "https://graph.facebook.com/me/feed";
    aq.auth(handle).ajax(url, JSONObject.class, new AjaxCallback<JSONObject>() {
        @Override
        public void callback(String url, JSONObject object, AjaxStatus status) {
            AQUtility.debug(TAG, object.toString());
        }
    });
}

Twitter

Twitter と連携したい場合、まずこちらのダウンロードページより signpost-core-1.2.1.1.jarsignpost-commonshttp4-1.2.1.1.jar をダウンロードして libs フォルダに追加しておく必要があります。
あとはこちらから開発者登録・アプリ登録を行い Consumer Key と Consumer Secret を取得しておきます。実装は Google Service, Facebook と同じ感じです!

private static final String CONSUMER_KEY = "YOUR_APP_CONSUMER_KEY";
private static final String CONSUMER_SECRET = "YOUR_APP_CONSUMER_SECRET";
public void getTweets(){
    // TwitterHandle インスタンスを生成
    TwitterHandle handle = new TwitterHandle(this, CONSUMER_KEY, CONSUMER_SECRET);
    AQuery aq = new AQuery(this);
    // twitterapiの タイムラインを取得
    String url = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=twitterapi";
    aq.auth(handle).ajax(url, JSONArray.class, new AjaxCallback<JSONArray>() {
        @Override
        public void callback(String url, JSONArray object, AjaxStatus status) {
            AQUtility.debug(TAG, object.toString());
        }
    });
}

Basic 認証

上記は既存サービスの認証でしたが、Android Query では通常の Basic 認証の実装もサポートしています。手順も大体同じ感じで簡単に実装できます!

public void auth(String email, String pass){
    // BasicHandle インスタンスを生成
    BasicHandle handle = new BasicHandle(email, pass);
    AQuery aq = new AQuery(this);
    String url = "http://yoursite/auth";
    // Basic 認証
    aq.auth(handle).ajax(url, JSONArray.class, new AjaxCallback<JSONArray>() {
        @Override
        public void callback(String url, JSONArray object, AjaxStatus status) {
            AQUtility.debug(TAG, object.toString());
        }
    });
}

まとめ

以上 Google Service, Facebook, Twitter, Basic 認証のそれぞれの認証処理を実装してみました。 Android Query は非同期通信処理がとてもシンプルに実装できるので、こういうところでかなり力を発揮すると思います。 どのサービスもフレームワークなしでは処理がかなり複雑になるので、ぜひ Android Query を活用してサクッと実装したいですね。

参考