2014-04-17 142 views
0

這是重新發布,因爲我之前問過這個問題,但我沒有得到任何答案。 我創建的Android應用程序具有「與Twitter帳戶登錄」功能,這個應用程序讀取Twitter上的追隨者列表。 我在登錄時沒有任何問題,但我的問題是如何讓應用始終在Twitter上登錄,而無需再次詢問用戶使用Twitter登錄。如何保持Twitter的身份驗證狀態,以避免每次打開應用程序時重新登錄

在第一次,用戶將被要求給我的應用程序這個權限,用戶將授權我的應用程序。 如果用戶關閉應用程序,然後再次打開它無需重新登錄到Twitter然後他試着用下面的代碼來獲取關注者列表:

ids = twitter.getFollowersIDs(twitterUserId, cursor); 

我會遇到錯誤:

04-06 12:04:41.881: E/AndroidRuntime(28630): at java.lang.Thread.run(Thread.java:1019) 
04-06 12:04:41.881: E/AndroidRuntime(28630): Caused by: java.lang.IllegalStateException: Authentication  credentials are missing. See http://twitter4j.org/en/configuration.html for details 
04-06 12:04:41.881: E/AndroidRuntime(28630): at twitter4j.TwitterBaseImpl.ensureAuthorizationEnabled(TwitterBaseImpl.java:201) 

當我試圖通過使用代碼從第一次成功登錄保存TWITTER_REQUEST_TOKEN,TWITTER_REQUEST_TOKEN_SECRET和TWITTER_VERIFIER後,下面的方法reLoginOnTwitter做重新登錄,我得到了錯誤:

401:Authentication credentials (https://dev.twitter.com/pages/auth) were missing or incorrect. Ensure that you have set valid consumer key/secret, access token/secret, and the system clock is in sync. 

任何人都可以幫助我,因爲我嘗試了很多搜索它,但我沒有找到任何有用的解決方案來解決這個問題。

我工作的登錄密碼和重新登錄方法的代碼都低於:

public static Twitter twitter; 
public void twitterLogin(Activity activity) { 
    String authUrl = null; 
    twitter = new TwitterFactory().getInstance(); 
    twitter.setOAuthConsumer(consumerKey, consumerSecret); 

    try { 

     if (android.os.Build.VERSION.SDK_INT > 9) { 
      StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
      StrictMode.setThreadPolicy(policy); 
     } 

     String callbackurlWithParams = CALLBACKURL; 
     requestToken = twitter.getOAuthRequestToken(callbackurlWithParams); 
     authUrl = requestToken.getAuthenticationURL(); 

     saveTwitterRequestData(requestToken.getToken(), requestToken.getTokenSecret(), activity); 
     Intent it = new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl)); 
     it.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
     activity.startActivity(it); 

    } catch (TwitterException e) { 
     Log.e(TAG, "Unexpected exception while login with twitter :" + e.toString()); 
    } 
} 

之後,我在的onResume方法和完整的Twitter登錄讀驗證。

public boolean reLoginOnTwitter(Activity activity) { 
     try { 

      if (twitter == null) { 
     twitter = new TwitterFactory().getInstance(); 
     twitter.setOAuthConsumer(consumerKey, consumerSecret); 
        } 

      SharedPreferences prefs = activity.getSharedPreferences(AppConstant.APP_PREF, 0); 
      final String verifier = prefs.getString(TWITTER_VERIFIER, null); 
          String reqToken = prefs.getString(TWITTER_REQUEST_TOKEN, null); 
        String reqTokenSecret = prefs.getString(TWITTER_REQUEST_TOKEN_SECRET, null); 
        RequestToken requestToken = new RequestToken(reqToken, reqTokenSecret); 

      if (requestToken != null) { 


       new AsyncTask<Void,Object, IDs>() { 
        String error = null; 
        @Override 
        protected IDs doInBackground(Void... arg0) { 
         try { 
          AccessToken accessToken = twitter.getOAuthAccessToken(requestToken, verifier); 
         } catch (TwitterException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        return null;  
        } 

        @Override 
        protected void onPostExecute(IDs Ids) { 
        } 
       }.execute(); 

       return true; 
      } 
     } catch (Exception e) { 
      Log.e(TAG, "request failed due to unexpected exception :" + e.toString()); 
      return false; 
     } 
    return false; 
} 
+0

嗨,你有沒有找到解決方案? – Abdel

回答

0

所以我對Android的瞭解不多,但是我之前使用了Twitter應用程序專用認證:https://dev.twitter.com/docs/auth/application-only-auth。它起作用了,你獲得的不記名令牌不會過期。另外,使用oAuth,您應該能夠從API獲得某種「長期」不記名令牌。我知道YouTube API有這個功能。

+0

謝謝。我現在閱讀它,但我發現:「使用純應用程序認證時,您沒有經過認證的用戶的上下文,這意味着對於需要用戶上下文的端點(例如發佈推文)的API的任何請求都不起作用」所以它不會幫助我。 –

相關問題