【Android】OAuth認証の仕方でハマる

androidアプリにて、Twitterクライアントを作るために
OAuth認証をする必要があった。

つまづいた所もあるので、メモ。
動作環境
motorola Xoom
Android 3.1



http://www.socym.co.jp/book/4883377571.html
ここからサンプルコードをいただく
Twitter クライアントアプリがある


https://dev.twitter.com/
Twitterにてアプリケーションの登録を行う
⇒登録内容
Name: OAuthSampleInterpia
Description: OAuth sample
WebSite:http://www.interpia.ne.jp/
Application type
Access: Read and Write
Callback URL: http://www.interpia.ne.jp/


ライブラリーの用意
(oauth-singpost)
http://code.google.com/p/oauth-signpost/
⇒singpost-commonshttp4-1.2.1.1.jar
singpost-core-1.2.1.1.jar
(twitter4j)
http://twitter4j.org/ja/index.html
⇒twitter4j-async-android-2.2.4.jar
twitter4j-core-android-2.2.4.jar
twitter4j-media-android-2.2.4.jar
twitter4j-stream-android-2.2.4.jar
それぞれ、ライブラリーに登録を行う。


ここから先は、サンプルコードの変更点のみ
OAuth認証のコード

private void doOAuth(String url){
try{
consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
provider = new CommonsHttpOAuthProvider(
"https://api.twitter.com/oauth/request_token",
"https://api.twitter.com/oauth/access_token",
"https://api.twitter.com/oauth/authorize");
provider.setOAuth10a(true);
//トークンの読込
SharedPreferences pref = getSharedPreferences("token", MODE_PRIVATE);
String token = pref.getString("token", "");
String tokenSecret= pref.getString("tokenSecret", "");

//認証済み
if (token.length()>0 && tokenSecret.length()>0){
Toast.makeText(this, "OK", Toast.LENGTH_LONG).show();
tweet("a");
}
else{
String authUrl = provider.retrieveRequestToken(consumer,CALLBACK_URL);
this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl)));
}

}catch(Exception e){
Log.e(TAG, e.getMessage());
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}

⇒ここではまったのが、
 String authUrl = provider.retrieveRequestToken(consumer,CALLBACK_URL);
の部分


Communication with the service provider failed: null
もしくは

Communication with the service provider failed: https://api.twitter.com/oauth/request_token

①の場合は、httpsへのアクセス自体せずに返ってくるのだが
これは、
Manifest



に修正したら通るようになった・・・。
Android2系と3系の違い・・・?
正直よくわからない(汗

②の場合は、CALLBACK_URLの設定がおかしかったようだ。
Twitter側へのアプリ登録設定(CALLBACK)と
アプリケーション側の設定がおかしいと失敗してしまう。

manifestの設定

android:scheme="myapp" android:host="mytwitt">

CODEの設定
private final String CALLBACK_URL="myapp://mytwitt";

これをきちんとあわせておいて、
なおかつ、
https://dev.twitter.com/
でのCallback URLへきちんと登録しないとダメみたいだ。
Callback URL: http://www.sample.com/


これでアプリケーションを動作させると
1.OAuth認証用のブラウザが立ち上がる
2.ブラウザで認証登録を行う
3.アプリケーションに戻ってくる


あとはTwitterにつぶやきたい文字列を
送るだけでメッセージは飛ぶ。


参考ページ
http://garlicg.blog92.fc2.com/blog-entry-2.html