我在android中使用Twitter4j API,當我從twitter瀏覽器屏幕按回按鈕取消授權(quán)時,它將我?guī)Щ氐絇repareRequestTokenActivity的onResume()(twitter4j api提供的活動),我正在從onResume完成此活動,但是當授權(quán)是成功的,然后它也會轉(zhuǎn)到onResume()然后轉(zhuǎn)到相同活動的onNewIntent()方法,但是活動從恢復完成并且身份驗證失敗.有沒有辦法從twitter瀏覽器屏幕捕獲后退按鈕?以下是活動.
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; } } }
解決方法:
只需將一個布爾標志初始化為false,使其在PrepareRequestTokenActivity的onNewIntent()函數(shù)中為true,并在onResume函數(shù)中添加一個if條件,如果此標志為false則完成活動,如果為true則不執(zhí)行任何操作,即單擊后退按鈕時從瀏覽器它直接轉(zhuǎn)到onResume,此時你的標志將是假的,然后這個活動將完成,當成功或不,謝謝它將首先轉(zhuǎn)到onNewIntent()然后onResume,所以是真的然后活動將不會完成
來源:https://www.icode9.com/content-1-282501.html