読者です 読者をやめる 読者になる 読者になる

FabricのTwitter-Kitを使って簡単な画像検索クライアントを作ってみた

f:id:misyobun:20150111235322p:plain

前回 GooglePlayのメタデータのレギュレーションとは・・・ - 未処分利益でGooglePlayのレギュレーションを調査するために作ったアプリで、入力された検索キーワードを元にしてTwitter上から関連する画像ツイートを取得することができます。

まめのちから - Google Play の Android アプリ

(GooglePlayのスクショはとっても寂しい感じですが、そのかいあって、今のところ粛正はされていないようですね)

ちなみに「可愛い犬」と検索すると、以下の通り可愛い犬関連のツイートを集めることができました。

f:id:misyobun:20150111163309p:plain

Fabric

今回のアプリはTwitterのAPIを使う必要があったのですが、迅速に開発を進めたかったこともありFabricを利用することにしました。

FabricはTwitterより公開されたモバイル開発者向けのSDKで、主に以下の3つのキットで構成されています。

  • Crashlytics
    • アプリのクラッシュ検知やパフォーマンス向上図れるキット
  • MoPub
    • 収益獲得のための広告配信キット(アプリの性質にあった広告配信が容易にできる)
  • Twitter-Kit
    • Native Tweet embeds(埋め込みネイティブツイート)
    • Tweet composer
    • Sign in with Twitter (柔軟なREST APIへのアクセスを可能とするインターフェイス含む)

今回はOAuth認証とREST APIの利用のためTwitter-Kitを使っています。
自分の開発プロジェクトにFabricを導入するにあたっては、Android Studio用のプラグインが公式より提供されているので、そちらをダウンロードして組み込みます。

Fabric - Twitter's Mobile Development Platform

Twitter-Kit

Twitterログインをする

TwitterLoginButtonを使う事で簡単にOAuthベースの認証ができます。 コード的にはこんな感じです。

loginButton = (TwitterLoginButton)
                              findViewById(R.id.login_button);
loginButton.setCallback(new Callback<TwitterSession>() {
   @Override
   public void success(Result<TwitterSession> result) {
      // ログイン成功時の処理
   }
 
   @Override
   public void failure(TwitterException exception) {
       // ログイン失敗時の処理
   }
});

このsuccessコールバックで取得できるTwitterSessionからAuthTokenとAuthTokenSecretも簡単に取得できます。(ただ、実装者はこの情報を基本的に使うことは無いのかと思います)

@Override
   public void success(Result<TwitterSession> result) {
      String token = result.data.getAuthToken().token;
      String secret = result.data.getAuthToken().secret;
   }

ボタンの外観は以下の通りです。

f:id:misyobun:20150111235825p:plain

REST APIをコールする

TwitterのREST APIには TwitterApiClient経由でアクセスします。 公式のTwitter Kit では

  • Tweets
  • Favorites
  • Search

上記の3つにしか対応していませんが、それ以外のAPIに対応するにはTwitterApiClientを継承したクラスを作成してそちらで独自に実装する必要があります。ただ、TwitterCoreKitRetrofitを採用しているのでインターフェイスを定義することで容易に対応できるでしょう。

お気に入り(Favorites)を行う場合は下記の要領で行えます。

private void doFav() {
  FavoriteService favs = TwitterCore.getInstance().getApiClient().getFavoriteService();
  favs.create(554231363218714624L,true,new Callback<Tweet>() {
   @Override
   public void success(Result<Tweet> tweetResult) {
             // tweetResultはお気に入りしたTweetの情報を保有します
          }

          @Override
          public void failure(TwitterException e) { 
          }
       });
}

ちなみに上記のコードを実行すると下記のツイートをお気に入りする事になります。 (喪女ブログというジャンル、個人的には2014から2015年にかけて一気に盛り上がるんじゃないでしょうかね。根拠は無いですけど)

下記はお気に入りのFavoriteServiceインターフェース定義です。

public interface FavoriteService {
    @retrofit.http.GET("/1.1/favorites/list.json")
    void list(@retrofit.http.Query("user_id") java.lang.Long aLong, @retrofit.http.Query("screen_name") java.lang.String s, @retrofit.http.Query("count") java.lang.Integer integer, @retrofit.http.Query("since_id") java.lang.String s1, @retrofit.http.Query("max_id") java.lang.String s2, @retrofit.http.Query("include_entities") java.lang.Boolean aBoolean, com.twitter.sdk.android.core.Callback<java.util.List<com.twitter.sdk.android.core.models.Tweet>> callback);

    @retrofit.http.FormUrlEncoded
    @retrofit.http.POST("/1.1/favorites/destroy.json")
    void destroy(@retrofit.http.Field("id") java.lang.Long aLong, @retrofit.http.Field("include_entities") java.lang.Boolean aBoolean, com.twitter.sdk.android.core.Callback<com.twitter.sdk.android.core.models.Tweet> callback);

    @retrofit.http.FormUrlEncoded
    @retrofit.http.POST("/1.1/favorites/create.json")
    void create(@retrofit.http.Field("id") java.lang.Long aLong, @retrofit.http.Field("include_entities") java.lang.Boolean aBoolean, com.twitter.sdk.android.core.Callback<com.twitter.sdk.android.core.models.Tweet> callback);
}

結論

結構簡単に使えたので便利。 次はMoPubを触ろう。