title: Twitter Authentication through Android's AccountManager classes
body: <p>I am developing an android application and want to integrate Twitter.</p>
  
  <p>What I understand is if on user's device, official android Twitter app is installed then we can authenticate using account manager as mentined <a href="https://stackoverflow.com/questions/4868770/twitter-authentication-through-androids-accountmanager-classes">here</a>.. and if not installed then show twitter login web page.</p>
  
  <p>Is my understanding correct?</p>
  
  <p>Now authenticating using twitter web login page is working fine. But how do I login using account manager?</p>
  
  <p>Using AccountsType as "com.twitter.android.auth.login" 
  I got token and token secret using account manager from 
  •com.twitter.android.oauth.token 
  •com.twitter.android.oauth.token.secret</p>
  
  <p>I am using Twitter4J, and authenticating with my CONSUMER_KEY &amp; CONSUMER_SECRET along with recvd. tokens. but authentication always fails.</p>
  
  <p>CONSUMER_KEY &amp; CONSUMER_SECRET are the keys I got when I registered the app at twitter... but I dont understand how can I use these keys with Official Android Twitter app authentication?</p>
  
  <p>Pls. let me know Thanks</p>
  
  <p>Here is my code</p>
  
  <pre><code>public class TwitterAuthentication {    
      private static final String TAG = "TwitterAuthentication";
      private static final int MSG_GOT_AUTH_TOKEN = 100;
      private static final int MSG_GOT_AUTH_SECRET = 101;
      private static final int MSG_NO_AUT_TOKEN_RECVD = 102;
  
      public static Twitter mTwitter = null;
      private Activity mActivity = null;
      private SharedPreferences prefs;
      private MessageHandler handler = new MessageHandler();
      public static boolean bAuthenticationDone = false;
  
  
  
      public TwitterAuthentication(Activity activity){
          mActivity = activity;
          prefs = PreferenceManager.getDefaultSharedPreferences(mActivity);
          if (null == mTwitter){
              mTwitter = new TwitterFactory().getInstance();;
              mTwitter.setOAuthConsumer(Constant.CONSUMER_KEY, Constant.CONSUMER_SECRET);
              bAuthenticationDone = false;
          }
  
      }
  
      public void LoginTwitter(){
          if (Constants.DEBUG)Log.d(TAG,"LoginTwitter");
          if (bAuthenticationDone){
              TwitterSessionEvents.onLoginSuccess();
          }
          else if (!isSessionValid()){
              AuthTwitter();
          }
          else{
  
              bAuthenticationDone = true;
              TwitterSessionEvents.onLoginSuccess();
          }       
      }
  
      public boolean isSessionValid(){
          boolean ret = false;
          if (null != prefs &amp;&amp; null != mTwitter){
              String token = prefs.getString(Constant.OAUTH_TOKEN, "");
              String secret = prefs.getString(Constant.OAUTH_TOKEN_SECRET, "");   
              if (null != token &amp;&amp; null != secret &amp;&amp; token.length()&gt;0 &amp;&amp; secret.length()&gt;0){
                  AccessToken a = new AccessToken(token,secret);  
                  mTwitter.setOAuthAccessToken(a);
                  try {
                      mTwitter.getAccountSettings();
                      keys.User_Id = mTwitter.getScreenName();
                      ret = true;
                  } catch (TwitterException e) {
                      ret = false;
                  }
              }
          }
          return ret;
      }
  
      public void AuthTwitter(){
  
          // First check if Account manager has valid token
          // Result of this is send in MSG
          CheckAccManagerForTwitter();
  
      }
  
  
      public Twitter getTwitter(){
          return mTwitter;
      }
  
      private boolean CheckAccManagerForTwitter(){
  
          AccountManager am = AccountManager.get(mActivity); 
          Account[] accts = am.getAccountsByType("com.twitter.android.auth.login");
          if(accts.length &gt; 0) {
              Account acct = accts[0];
  
              am.getAuthToken(acct, "com.twitter.android.oauth.token", null, mActivity, new AccountManagerCallback&lt;Bundle&gt;() {
  
                  @Override
                  public void run(AccountManagerFuture&lt;Bundle&gt; arg0) {
                      try {
                          Bundle b = arg0.getResult();
                          String token = b.getString(AccountManager.KEY_AUTHTOKEN);
                          String userName = b.getString(AccountManager.KEY_ACCOUNT_NAME);
                          handler.sendMessage(handler.obtainMessage(MSG_GOT_AUTH_TOKEN, token));
                      }
                      catch (Exception e) {
                          Log.e(TAG, "EXCEPTION@AUTHTOKEN");
                          handler.sendEmptyMessage(MSG_NO_AUT_TOKEN_RECVD);
                      }
                  }}, null); 
  
              am.getAuthToken(acct, "com.twitter.android.oauth.token.secret", null, mActivity, new AccountManagerCallback&lt;Bundle&gt;() {
  
                      @Override
                      public void run(AccountManagerFuture&lt;Bundle&gt; arg0) {
                          try {
                              Bundle b = arg0.getResult();
                              String secret = b.getString(AccountManager.KEY_AUTHTOKEN);
                              handler.sendMessage(handler.obtainMessage(MSG_GOT_AUTH_SECRET,secret));
  
                              }
                          catch (Exception e) {
                              Log.e(TAG, "EXCEPTION@AUTHTOKEN");
                              handler.sendEmptyMessage(MSG_NO_AUT_TOKEN_RECVD);
                              }
                          }}, null); 
                  //
          }
          else{
              // No twitter account found in Account Manager
              Log.e(TAG, "No Twitter account in Account manager");
              handler.sendEmptyMessage(MSG_NO_AUT_TOKEN_RECVD);
  
          }
  
          return true;
          }
  
      class MessageHandler extends Handler {
          String token = null;
          String secret = null;
          @Override
          public void handleMessage(Message msg) {
              if (msg.what == MSG_GOT_AUTH_TOKEN | msg.what ==MSG_GOT_AUTH_SECRET){
                  if (msg.what == MSG_GOT_AUTH_TOKEN){        
                      token = (String)msg.obj;
                  }
                  else if (msg.what == MSG_GOT_AUTH_SECRET){
                      secret = (String)msg.obj;
                  }
                  if (null != token &amp;&amp; null != secret){
                      AccessToken accesstoken = new AccessToken(token,secret);
                      mTwitter.setOAuthAccessToken(accesstoken);
                      try {
                          mTwitter.getAccountSettings();
                          keys.User_Id = mTwitter.getScreenName();                    
                      } catch (Exception e) {
                          // That means Authentication Failed
                          // So fall back to web login 
                          Intent i = new Intent(mActivity.getApplicationContext(), PrepareRequestTokenActivity.class);
                          mActivity.startActivity(i);                 
                      }
                  }
  
              }
              else if (msg.what == MSG_NO_AUT_TOKEN_RECVD){
                  // That means There is no twiter account with Account Manager
                  // So fall back to web login 
                  Intent i = new Intent(mActivity.getApplicationContext(), PrepareRequestTokenActivity.class);
                  mActivity.startActivity(i);                 
              }
          }
      }
  
  
  
      public void LogoutTwiter(){
  
  
      }
  
  }
  </code></pre>