tweet

twitter4J 3.0.3 Android実装、 Twitter API 1.1対応 OAuth認証 --2013/03/08

twitter4J 3.0.3 Android実装、 Twitter API 1.1対応 OAuth認証 --2013/03/08

春ですね、梅の咲く時期!!
twitter API 1.1ですが、
2013/03/05で切り替えみたいな記事見ましたので、旧APIでAndroid実装してた部分の、改修やってみました。
今頃修正しても、遅いのですが(汗、、)
現時点で、旧API 1.0でも動くみたいですが、将来的に無くなると予想して作業です。
twitter4J 2.x -> 3.0.3 の移植ですが、結構ハマリました。Androidのサンプルが少い気がしました。

準備などは下記サイトを参考。
推奨されない方法みたいですが、WebView使ってます。
基本はtwitter4J 2.xに似てます。下記ソースです。

1) requestTokenの生成, Intent起動して、onActivityResultでAccesToken生成します、
==============================================
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.auth.AccessToken;
import twitter4j.auth.OAuthAuthorization;
import twitter4j.auth.RequestToken;
import twitter4j.conf.Configuration;
import twitter4j.conf.ConfigurationContext;

public static OAuthAuthorization _oauth = null;
private RequestToken requestToken = null;
String mCallbackURL = "myapp://oauth";

public class LoadTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void ... params) {
try
{
exec_connect();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
try
{
start_Intent();
}catch(Exception e){
e.printStackTrace();
}
}
}

    private void start_Intent() throws Exception{
    try
    {
         Intent intent = new Intent(this, TwitterLogin.class);
         intent.putExtra("auth_url", requestToken.getAuthorizationURL());
         this.startActivityForResult(intent, REQUEST_CODE);
    }catch( Exception e){
    throw e;
    }
    }
 

    private void exec_connect() throws Exception{
    try
    {
//Log.d(TAG, "#exec_connect=" );    
            //Twitetr4Jの設定を読み込む
            Configuration conf = ConfigurationContext.getInstance();
            //Oauth認証オブジェクト作成
            _oauth = new OAuthAuthorization(conf);
            _oauth.setOAuthConsumer(m_Const.CONSUMER_KEY, m_Const.CONSUMER_SECRET) ;
            //アプリの認証オブジェクト作成
            try {
                requestToken = _oauth.getOAuthRequestToken(mCallbackURL);
            } catch (TwitterException e) {
                e.printStackTrace();
            }
    }catch( Exception e){
    throw e;
    }
    }



2) WebView, コールバック[oauth_verifier]をGETします。
==============================================
package com.kuc_arc_f.app.hoge;

import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import com.kuc_arc_f.fw.*;


public class TwitterLogin extends Activity {

//
private com.kuc_arc_f.fw.ComUtil m_Util = new ComUtil();

protected void onCreate(Bundle bundle) {

super.onCreate(bundle);
        setContentView(R.layout.twitterlogin );
        try
        {
        init_proc();
        }catch(Exception e){
        e.printStackTrace();
        m_Util.errorDialog(this, e.toString() + e.getMessage());
        }
}
//
private void init_proc() throws Exception{
try
{
WebView webView = (WebView)findViewById(R.id.twitterlogin);
webView.setWebViewClient(new WebViewClient(){

public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);

String CALLBACK_URL = "myapp://oauth";

if(url != null && url.startsWith(CALLBACK_URL)){
String[] urlParameters = url.split("\\?")[1].split("&");

String oauthToken = "";
String oauthVerifier = "";

if(urlParameters[0].startsWith("oauth_token")){
oauthToken = urlParameters[0].split("=")[1];
}else if(urlParameters[1].startsWith("oauth_token")){
oauthToken = urlParameters[1].split("=")[1];
}

if(urlParameters[0].startsWith("oauth_verifier")){
oauthVerifier = urlParameters[0].split("=")[1];
}else if(urlParameters[1].startsWith("oauth_verifier")){
oauthVerifier = urlParameters[1].split("=")[1];
}

Intent intent = getIntent();
intent.putExtra("oauth_token"   , oauthToken);
intent.putExtra("oauth_verifier", oauthVerifier);

setResult(Activity.RESULT_OK, intent);
finish();
}
}
});

// 認証ページを表示。
webView.loadUrl(this.getIntent().getExtras().getString("auth_url"));
}catch(Exception e){
throw e;
}
}

}
3) AccessTokenをGETします。
==============================================
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {

if(resultCode == RESULT_OK){
super.onActivityResult(requestCode, resultCode, intent);

TokenTask tsk = new TokenTask();
tsk.execute(intent);
}
}
 
public class TokenTask extends AsyncTask<Intent, Void, Void> {
@Override
protected Void doInBackground(Intent ... params) {
try
{
m_RetAcToken= m_Const.NG_CODE;
AccessToken token = null;
token =  _oauth.getOAuthAccessToken( requestToken, params[0].getExtras().getString("oauth_verifier"));
//Log.d(TAG, "TokenTask.token="+ token.getToken());
//Log.d(TAG, "TokenTask.token.oauth_token_secret="+ token.getTokenSecret());
m_RetAcToken= m_Const.OK_CODE;
            } catch (TwitterException e) {
                e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
try
{
if(m_RetAcToken.equals( m_Const.OK_CODE)){
//ok
}else{
m_Util.errorDialog(BG01Act.this, "system error, fail get AccessToken .");
}
}catch(Exception e){
e.printStackTrace();
}
}
}
==============================================

*)参考サイト様:
http://techbooster.org/android/mashup/5301/
http://techbooster.org/android/5040/
http://qiita.com/items/f6f39900fd5e449045f9

コメント

AD-parts

Shop
Bluetooth搭載
ベース基板

FACEBOOK

人気の投稿