どこのページに行ってもOAuthの事に関していろいろ書いてあるけど率直で使いやすいものがあまりみつからない。(俺の頭が悪いだけ)
というわけで今回はAndroidでTwitterのOAuth認証を簡単にできるActivityを作った。
このActivityに飛ばしてあげるだけでOK。
ここではTwitter4j 2.1.8を使っています。
getOAuthRequestTokenメソッドにコールバックを指定するとなぜかエラーで落ちてしまうので、それを回避するように作ってます。
onAuthorizedメソッドの引数にAccessTokenとAccessTokenSecretが飛んできますのでご自由にお使いください。
以下ソースコード
import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.*;
import android.view.*;
import android.view.View.OnClickListener;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.*;
import twitter4j.*;
import twitter4j.http.*;
public void onAuthorized(String accessToken,String accessTokenSecret){
//認証後後にやりたいことをここに書く。
finish();
}
public class TwitterOAuth extends Activity{
private Display display;
private Handler handler = new Handler();
private LinearLayout base,form;
private EditText verifier;
private WebView wb;
private Twitter twitter;
private AccessToken accToken;
private RequestToken reqToken;
private final String CONSUMER_KEY = “xxxxxxxxxxxxxxxxx”; // Consumer key をセット
private final String CONSUMER_SECRET = “yyyyyyyyyyyyyyyyyyy”; // Consumer secret をセット
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedPreferences pref = getPreferences(MODE_PRIVATE);
if(pref.getString(“AccessToken”,””).equals(“”)||pref.getString(“AccessTokenSecret”,””).equals(“”)){
display = ((WindowManager)getSystemService(this.WINDOW_SERVICE)).getDefaultDisplay();
base = new LinearLayout(this);
base.setOrientation(LinearLayout.VERTICAL);
form = new LinearLayout(this);
form.setOrientation(LinearLayout.HORIZONTAL);
verifier = new EditText(this);
verifier.setWidth(display.getWidth()-100);
verifier.setHeight(20);
Button button = new Button(this);
button.setText(“OK”);
button.setHint(“PIN CODE”);
button.setWidth(100);
button.setHeight(20);
button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
handler.post(new Runnable(){
public void run(){
try {
accToken = twitter.getOAuthAccessToken(reqToken,verifier.getText().toString());
Editor e = getPreferences(MODE_PRIVATE).edit();
String accessToken = accToken.getToken();
String accessTokenSecret = accToken.getTokenSecret();
e.putString(“AccessToken”,accessToken);
e.putString(“AccessTokenSecret”,accessTokenSecret);
e.commit();
onAuthorized(accessToken,accessTokenSecret);
} catch (TwitterException e) {}
}
});
}
});
wb = new WebView(this);
wb.setWebViewClient(new WebViewClient());
form.addView(verifier);
form.addView(button);
base.addView(form);
base.addView(wb,new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
setContentView(base);
doAuthorize();
}else{
Toast.makeText(this,”You are already authorized.”, Toast.LENGTH_LONG).show();
finish();
}
}
public void doAuthorize(){
twitter = new TwitterFactory().getOAuthAuthorizedInstance(CONSUMER_KEY,CONSUMER_SECRET);
try{
reqToken = twitter.getOAuthRequestToken();
wb.loadUrl(reqToken.getAuthorizationURL().toString());
wb.requestFocus(View.FOCUS_DOWN);
}catch(Exception e){Toast.makeText(this, “ERROR.”,Toast.LENGTH_SHORT).show();}
}
}