Twitter Authentication through AccountManager classes for Android

I am developing an Android application and want to integrate Twitter.

I understand that if the official Android application for Android is installed on the user device, we can authenticate using the account manager as sketched here .. and if it is not installed, then show the Twitter login web page.

Do I understand correctly?

Authentication using the twitter login web page now works fine. But how do I log in with my account manager?

Using AccountsType as "com.twitter.android.auth.login" I have a token and token using the account manager β€’ com.twitter.android.oauth.token β€’ com.twitter.android.oauth.token.secret

I use Twitter4J and authenticate with CONSUMER_KEY and CONSUMER_SECRET along with recvd. tokens. but authentication always fails.

CONSUMER_KEY and CONSUMER_SECRET are the keys that I received when I registered the application on twitter ... but I do not understand how I can use these keys with official Android authentication of Twitter?

Pls. let me know thanks

Here is my 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 && null != mTwitter){ String token = prefs.getString(Constant.OAUTH_TOKEN, ""); String secret = prefs.getString(Constant.OAUTH_TOKEN_SECRET, ""); if (null != token && null != secret && token.length()>0 && secret.length()>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 > 0) { Account acct = accts[0]; am.getAuthToken(acct, "com.twitter.android.oauth.token", null, mActivity, new AccountManagerCallback<Bundle>() { @Override public void run(AccountManagerFuture<Bundle> 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<Bundle>() { @Override public void run(AccountManagerFuture<Bundle> 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 && 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(){ } } 
+7
source share
2 answers

The credentials com.twitter.android.oauth.token and com.twitter.android.oauth.token.secret returned by the Android AccountManager are authenticated only using the Twitter user key and privacy. AFAIK They are really not useful to third-party developers.

As for Twitter, I’ll just say that the official consumer Key / Secret pair is β€œthere”, and if Twitter changed them with an application update, they broke OAuth for each user without updating this application.

+3
source

well you use the secret and consumer key to actually get the token. using Android accounts, you get a token from them.

So, in general, to make a tweet, for example, you only need a token, and, as I said, you get it either from accounts or from twitter4j. so after you get the token from the accounts, you need to set it as a 4jsdk twitter token and use the api regularly.

Hope this makes sense.

+1
source

All Articles