Twitterの認証と投稿を一つの流れまとめたい
現在AndroidとTwitterを連携させたアプリを作っており、認証ボタンを押すと認証して投稿するという処理を行っているのですが、メッセージ投稿後に少し問題があります。
認証ボタンを押すとブラウザでTwitterの認証画面が開き、「連携アプリを認証」というボタンを押すと認証が完了して元のAndroidアプリの画面に戻り、設定してあったメッセージがTwitterに投稿されます。しかし、マルチタスクボタンを押してもう一度認証を行ったブラウザを開き、そのページにある「もし自動的に移動しない場合は、ここをクリックして続行→してください。」という文をクリックするとAndroidアプリの画面に戻るのですが、その際にもう一度メッセージが投稿されてしまいます。
「もし自動的に移動しない場合は、ここをクリックして続行→してください。」を押してもonPostExecute
を経由せずに投稿処理を行わないためにはどうすればよろしいでしょうか?お手数ですが、皆様の知恵をお借りしたいです。すみませんが、宜しくお願いします。
public class TwitterOAuthActivity extends Activity{
private String mCallbackURL;
private Twitter mTwitter;
private RequestToken mRequestToken;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCallbackURL = getString(R.string.twitter_callback_url);
mTwitter = TwitterUtils.getTwitterInstance(this);
startAuthorize();
}
public void startAuthorize() {
AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... params) {
try {
mRequestToken = mTwitter.getOAuthRequestToken(mCallbackURL);
return mRequestToken.getAuthorizationURL();
} catch (TwitterException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String url) {
if (url != null) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
} else {
// 失敗。。。
}
}
};
task.execute();
}
@Override
public void onNewIntent(final Intent intent) {
super.onNewIntent(intent);
if (intent == null
|| intent.getData() == null
|| !intent.getData().toString().startsWith(mCallbackURL)) {
return;
}
String verifier = intent.getData().getQueryParameter("oauth_verifier");
AsyncTask<String, Void, AccessToken> task = new AsyncTask<String, Void, AccessToken>() {
@Override
protected AccessToken doInBackground(String... params) {
Pattern p = Pattern.compile("denied");
Matcher m = p.matcher(intent.getData().toString());
try {
if (m.find()) {
startActivity(new Intent(TwitterOAuthActivity.this, MainActivity.class));
} else {
return mTwitter.getOAuthAccessToken(mRequestToken, params[0]);
}
} catch (TwitterException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(AccessToken accessToken) {
if (accessToken != null) {
// 認証成功
successOAuth(accessToken);
} else {
// 認証失敗
}
}
};
task.execute(verifier);
}
private void successOAuth(AccessToken accessToken) {
TwitterUtils.storeAccessToken(this, accessToken);
PostTwitter postTwitter = new PostTwitter();
postTwitter.share(TwitterOAuthActivity.this); //ここでTwitterへの投稿処理を行っています。
}
}