5548


現在AndroidとTwitterを連携させたアプリを作っており、認証ボタンを押すと認証して投稿するという処理を行っているのですが、メッセージ投稿後に少し問題があります。  
認証ボタンを押すとブラウザでTwitterの認証画面が開き、「連携アプリを認証」というボタンを押すと認証が完了して元のAndroidアプリの画面に戻り、設定してあったメッセージがTwitterに投稿されます。しかし、マルチタスクボタンを押してもう一度認証を行ったブラウザを開き、そのページにある「もし自動的に移動しない場合は、ここをクリックして続行→してください。」という文をクリックするとAndroidアプリの画面に戻るのですが、その際にもう一度メッセージが投稿されてしまいます。  
「もし自動的に移動しない場合は、ここをクリックして続行→してください。」を押しても`onPostExecute`を経由せずに投稿処理を行わないためにはどうすればよろしいでしょうか？お手数ですが、皆様の知恵をお借りしたいです。すみませんが、宜しくお願いします。

[code]

    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への投稿処理を行っています。
        }
    }
    
[/code]


CC BY-SA 3.0
2015-01-29T01:53:51.570
5545
2015-01-29T03:17:55.723
5210
question
android twitter4j
Twitterの認証と投稿を一つの流れまとめたい


送ったかどうかをフラグで持たせておくのはどうでしょうか？

[code]

    private boolean mSent = false;
    private void successOAuth(AccessToken accessToken) {
        TwitterUtils.storeAccessToken(this, accessToken);
        if (mSent) { return; }
        PostTwitter postTwitter = new PostTwitter();
        postTwitter.share(TwitterOAuthActivity.this);    //ここでTwitterへの投稿処理を行っています。
        mSent = true;
    }
    
[/code]

Activity再生成時にmSentが初期値に戻ると意味が無いので、ちゃんとonSaveInstanceState()で保存するようにしておきます。

[code]

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        if (savedInstanceState != null) {
            mState = savedInstanceState.getBoolean(STATE_SENT);
        }
        mCallbackURL = getString(R.string.twitter_callback_url);
        mTwitter = TwitterUtils.getTwitterInstance(this);
        startAuthorize();
    }
    
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean(STATE_SENT, mSent);
    }
    
[/code]


CC BY-SA 3.0
2015-01-29T03:17:55.723
5548
2015-01-29T03:17:55.723
845
5545
answer