我正在开发一个
Android应用程序,并希望集成Twitter.
我所理解的是,如果在用户的设备上安装了官方的Android Twitter应用程序,那么我们可以使用账户经理进行身份验证,如果没有安装,则显示twitter登录网页.
我的理解是否正确?
现在使用twitter web登录页面进行身份验证工作正常.但是如何使用客户经理登录?
使用AccountsType作为“com.twitter.android.auth.login”
我使用来自的客户经理获得了令牌和令牌秘密
•com.twitter.android.oauth.token
•com.twitter.android.oauth.token.secret
我正在使用Twitter4J,并使用我的CONSUMER_KEY& CONSUMER_SECRET和recvd.令牌.但身份验证始终失败.
CONSUMER_KEY& CONSUMER_SECRET是我在twitter上注册应用程序时获得的密钥…但我不明白如何在官方Android Twitter应用程序身份验证中使用这些密钥?
PLS.让我知道谢谢
这是我的代码
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",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(){ } }
解决方法
Android的AccountManager返回的com.twitter.android.oauth.token和com.twitter.android.oauth.token.secret凭据仅使用Twitter的官方消费者密钥和密钥进行身份验证. AFAIK他们对第三方开发人员实际上并没有用.
关于Twitter我只会说官方的消费者密钥/密钥对是“在那里”,如果Twitter通过应用程序更新改变它们,他们将为没有该应用程序更新的每个用户打破OAuth.