I am using Twitter4j API in android, when I press back button from the twitter browser screen to cancel authorization, it takes me back to onResume() of PrepareRequestTokenActivity (activity provided by twitter4j api) and I am finishing this activity from onResume, but when authorization is successful, then also it is going to onResume() and then to the onNewIntent() method of same activity, but activity get finished from on resume and authentication get failed. Is there any way to capture back button from twitter browser screen? below is the activity.
public class PrepareRequestTokenActivity extends Activity {
public static final String CONSUMER_KEY = "Hr8aDOFeDdY9UbvQB0w2w";
public static final String CONSUMER_SECRET= "wfZOJYkYVEYrmdmltOaKfRdnUfSiUkr2MQdjRUY2xU";
public static final String REQUEST_URL = "http://twitter.com/oauth/request_token"; //"https://api.twitter.com/oauth/request_token"
public static final String ACCESS_URL = "http://twitter.com/oauth/authorize"; //"https://api.twitter.com/oauth/authorize"
public static final String AUTHORIZE_URL = "http://twitter.com/oauth/access_token"; //"https://api.twitter.com/oauth/access_token"
final public static String OAUTH_CALLBACK_SCHEME = "droidnotify-oauth-twitter";
final public static String OAUTH_CALLBACK_URL = OAUTH_CALLBACK_SCHEME + "://callback";
private boolean _debug = false;
private OAuthConsumer _consumer;
private OAuthProvider _provider;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
_debug = Log.getDebug();
if (_debug) Log.v("PrepareRequestTokenActivity.onCreate()");
try {
_consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
//_provider = new CommonsHttpOAuthProvider(REQUEST_URL, ACCESS_URL, AUTHORIZE_URL);
_provider = new DefaultOAuthProvider(REQUEST_URL, ACCESS_URL, AUTHORIZE_URL);
} catch (Exception ex) {
if (_debug) Log.e("PrepareRequestTokenActivity.onCreate() Error creating consumer / provider: " + ex.toString());
}
if (_debug) Log.v("PrepareRequestTokenActivity.onCreate() Starting task to retrieve request token.");
new OAuthRequestTokenTask(this, _consumer, _provider).execute();
}
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (_debug) Log.v("PrepareRequestTokenActivity.onNewIntent()");
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
final Uri uri = intent.getData();
if (uri != null && uri.getScheme().equals(OAUTH_CALLBACK_SCHEME)) {
if (_debug) Log.v("PrepareRequestTokenActivity.onNewIntent() Callback received : " + uri);
if (_debug) Log.v("PrepareRequestTokenActivity.onNewIntent() Retrieving Access Token");
new RetrieveAccessTokenTask(this, _consumer, _provider, prefs).execute(uri);
finish();
}
}
public class RetrieveAccessTokenTask extends AsyncTask<Uri, Void, Void> {
private Context _context;
private OAuthProvider _provider;
private OAuthConsumer _consumer;
private SharedPreferences _prefs;
public RetrieveAccessTokenTask(Context context, OAuthConsumer consumer,OAuthProvider provider, SharedPreferences prefs) {
_context = context;
_consumer = consumer;
_provider = provider;
_prefs=prefs;
}
@Override
protected Void doInBackground(Uri...params) {
final Uri uri = params[0];
final String oauth_verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER);
try {
_provider.retrieveAccessToken(_consumer, oauth_verifier);
final Editor edit = _prefs.edit();
edit.putString(OAuth.OAUTH_TOKEN, _consumer.getToken());
edit.putString(OAuth.OAUTH_TOKEN_SECRET, _consumer.getTokenSecret());
edit.commit();
String token = _prefs.getString(OAuth.OAUTH_TOKEN, "");
String secret = _prefs.getString(OAuth.OAUTH_TOKEN_SECRET, "");
_consumer.setTokenWithSecret(token, secret);
//_context.startActivity(new Intent(_context, AndroidTwitterSample.class));
//executeAfterAccessTokenRetrieval();
Toast.makeText(_context, "Twitter Authentication Successfull", Toast.LENGTH_LONG);
Toast.makeText(_context, "OAuth.OAUTH_TOKEN KEY: " + OAuth.OAUTH_TOKEN + ", OAuth.OAUTH_TOKEN Value: " + _consumer.getToken(), Toast.LENGTH_LONG);
Toast.makeText(_context, "OAuth.OAUTH_TOKEN_SECRET KEY: " + OAuth.OAUTH_TOKEN_SECRET + ", OAuth.OAUTH_TOKEN_SECRET Value: " + _consumer.getTokenSecret(), Toast.LENGTH_LONG);
if (_debug) Log.v("OAuth - Access Token Retrieved");
} catch (Exception ex) {
if (_debug) Log.e("OAuth - Access Token Retrieval Error: " + ex.toString());
}
return null;
}
}
}
Just take one boolean flag initialize with false make it true in onNewIntent() function of your PrepareRequestTokenActivity and add one if condition in your onResume function that if this flag is false then finish activity and if true dont do anything , i.e when you click back button from browser it directly goes to onResume at that point your flag will be false then this activity will finished and when on success or No thanks it will first go to onNewIntent() then onResume , so true then activity will not finished