忍者ブログ

アンドロイドのあれこれ

WebView使わずに、twitter4j のOAuth認証
Androidで、twitter4jライブラリーを使ったWebViewなしOAuth認証サンプルコードの紹介します。
OAuth認証にWebViewってなにがいけないの?という方は以下の記事を読むのをおすすめします。

OAuthの認証にWebViewを使うのはやめよう
http://shogo82148.github.com/blog/2012/11/24/no-more-webview/


Twitter4j
http://twitter4j.org/

WebViewを使わずにOAuthの認証する方法はほかにもありますが、ここで紹介する方法はWebViewのかわりに本アプリからブラウザーアプリを立ち上げてユーザーが認証したあとにアプリへ戻るようにしています。

SignTwitterActivty.java
public class SignTwitterActivity extends Activity{

private static String ConsumerKey = "xxxx";
private static String ConsumerSecret = "xxxxxxxxxxxxxxxxxxxxxxxx";
public static RequestToken _req = null;
public static OAuthAuthorization _oauth = null;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

Button reqOAuth = (Button)findViewById(R.id.request_oauth);
reqOAuth.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View v) {
//twitterにoauthリクエストする
startTwitterOAuth();
}
});
}

//twitterにoauthリクエストを送る
private void startTwitterOAuth(){
//Twitetr4jの設定を読み込む
Configuration conf = ConfigurationContext.getInstance();

//Oauth認証オブジェクト作成
_oauth = new OAuthAuthorization(conf);
//Oauth認証オブジェクトにconsumerKeyとconsumerSecretを設定
_oauth.setOAuthConsumer(ConsumerKey, ConsumerSecret);
//アプリの認証オブジェクト作成
try {
//認証後アプリに戻るようにcallbackを設定
_req = _oauth.getOAuthRequestToken("demotwittercallback://SignTwitterActivity");
} catch (TwitterException e) {
Log.v("TEST", "err:" + e.getErrorMessage(), e);
}
String uri = _req.getAuthorizationURL();

//ブラウザーアプリへ移動、RequestTokenを取得するために
startActivity(new Intent(Intent.ACTION_VIEW , Uri.parse(_uri)));
finish();
}

@Override
protected void onResume() {
super.onResume();

//callback - Twitterの認証画面から発行されるIntentからUriを取得
Uri uri = getIntent().getData();
if(uri != null && uri.toString().startsWith("demotwittercallback://SignTwitterActivity")){
TwitterCallbackAsyncTask callbackTask = new TwitterCallbackAsyncTask(this);
callbackTask.execute(uri);
}
}
}

TwitterCallbackAsyncTask.java
public class TwitterCallbackAsyncTask extends AsyncTask<Uri, Integer, AccessToken>{

@Override
protected AccessToken doInBackground(Uri... params) {
Uri callbackUri = params[0];
String resp = null;
AccessToken accToken = null;
String verifier = callbackUri.getQueryParameter("oauth_verifier");
try {
accToken = SignTwitterActivity._oauth.getOAuthAccessToken(
SignTwitterActivity._req, verifier);
} catch (TwitterException e) {
Log.v("ERR","callback err:" + e.getMessage());
return null;
}
return accToken;
}

@Override
protected void onPostExecute(AccessToken result){
if (result != null) {
/**
/* tokenとtokenSecretの取得
/* String token = result.getToken();
/* String tokenSecret = result.getTokenSecret();
*/
} else {
Log.v("ERR","callback task error.");
}
}
}


ブラウザーアプリからのインテントを受け取るためにAndroidManifest.xmlにintent-filterを追加
....
<activity android:name=".SignTwitterActivity">
<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="demotwittercallback" />
</intent-filter>
</activity>
....



PS.
(´;ω;`)アドベントカレンダーなのに毎日の更新が追いつかなくて申し訳ありませんm(__;)m
COMMENT
NAME
TITLE
MAIL (非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS (コメント編集に必須です)
SECRET
管理人のみ閲覧できます
 
PR
© Android Advent
powered by 忍者ツールズ / 忍者ブログ / [PR]