2012年2月2日

【Android】TwitterAPIを使用する(1)

以前、OAuthの解説をしましたが、
今回はコードで実例を示しつつ解説したいと思います。


TwitterAPIをAndroidで使用するには、signpostのSDKを使用します。
まずは、
signpost-core-1.2.1.1.jar
signpost-commonshttp4-1.2.1.1.jar
をダウンロードし、ビルドパスを通してください。

今回のメインはconsumerとproviderのオブジェクト作成の解説になります。
まずはオブジェクトをprivateで定義しておきます。
private CommonsHttpOAuthConsumer consumer;
private OAuthProvider provider;
consumerとproviderは使いまわすので、
こんな感じで宣言しておいてください。

次に、onCreateでtokenとtoken_secretが保存されているかを確認しつつ、
無ければTwitterログイン画面をブラウザで開く部分を実装します。
// get old tokens
SharedPreferences prefs = getPreferences(MODE_PRIVATE);
String token = prefs.getString("token", null);
String tokenSecret = prefs.getString("tokenSecret", null);

// create oauth consumer and provider
consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
if(token != null && tokenSecret != null){
  consumer.setTokenWithSecret(token, tokenSecret);
}else{
  try {
    provider = new DefaultOAuthProvider(
      "https://api.twitter.com/oauth/request_token",
      "https://api.twitter.com/oauth/access_token",
      "https://api.twitter.com/oauth/authorize");
    String authUrl = provider.retrieveRequestToken(consumer,CALLBACKURL);
    this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl)));
  } catch (Exception e) {
    Log.e(TAG, e.getMessage(), e);
  }
}
tokenとtokenSecretがあればconsumer作成、無ければINTENTを発行するという部分です。

次に、ログイン後にアプリに戻ってくる部分です。
まずはAndroidManifest.xml
<activity
    android:label="@string/app_name"
    android:name=".ActivityMain"
    <!-- add this here -->
    android:launchMode="singleInstance" 
  >

  <!-- add this here -->
  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="myapp" android:host="callback" />
  </intent-filter>
こんな感じで足してください。
android:schemeとandroid:hostは
CALLBACKURLで"myapp://callback"と指定しているものと同じものを使ってください。

最後にActivityMain.javaのonNewIntentでIntentを受け取って解析します。

@Override
protected void onNewIntent(final Intent intent){
  super.onNewIntent(intent);
  final Uri uri = intent.getData();
  // return from Twitter OAuth
  if(uri != null && uri.toString().startsWith(CALLBACKURL)){
    try {
      String verifier = uri.getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER);
      provider.retrieveAccessToken(consumer, verifier);
      // set prefs
      SharedPreferences prefs = getPreferences(MODE_PRIVATE);
      SharedPreferences.Editor editor = prefs.edit();
      editor.putString("token", consumer.getToken());
      editor.putString("tokenSecret", consumer.getTokenSecret());
      editor.commit();
    } catch (Exception e) {
      Log.e(TAG, e.getMessage(), e);
      Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  }
}

tokenとtoken_secretは保存しておきます。
これで次回からもアクセス可能になります。

次回はconsumerとproviderを使ったAPIアクセスになります。