通过Android的AccountManager类进行Twitter身份验证

前端之家收集整理的这篇文章主要介绍了通过Android的AccountManager类进行Twitter身份验证前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在开发一个 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.让我知道谢谢

这是我的代码

  1. public class TwitterAuthentication {
  2. private static final String TAG = "TwitterAuthentication";
  3. private static final int MSG_GOT_AUTH_TOKEN = 100;
  4. private static final int MSG_GOT_AUTH_SECRET = 101;
  5. private static final int MSG_NO_AUT_TOKEN_RECVD = 102;
  6.  
  7. public static Twitter mTwitter = null;
  8. private Activity mActivity = null;
  9. private SharedPreferences prefs;
  10. private MessageHandler handler = new MessageHandler();
  11. public static boolean bAuthenticationDone = false;
  12.  
  13.  
  14.  
  15. public TwitterAuthentication(Activity activity){
  16. mActivity = activity;
  17. prefs = PreferenceManager.getDefaultSharedPreferences(mActivity);
  18. if (null == mTwitter){
  19. mTwitter = new TwitterFactory().getInstance();;
  20. mTwitter.setOAuthConsumer(Constant.CONSUMER_KEY,Constant.CONSUMER_SECRET);
  21. bAuthenticationDone = false;
  22. }
  23.  
  24. }
  25.  
  26. public void LoginTwitter(){
  27. if (Constants.DEBUG)Log.d(TAG,"LoginTwitter");
  28. if (bAuthenticationDone){
  29. TwitterSessionEvents.onLoginSuccess();
  30. }
  31. else if (!isSessionValid()){
  32. AuthTwitter();
  33. }
  34. else{
  35.  
  36. bAuthenticationDone = true;
  37. TwitterSessionEvents.onLoginSuccess();
  38. }
  39. }
  40.  
  41. public boolean isSessionValid(){
  42. boolean ret = false;
  43. if (null != prefs && null != mTwitter){
  44. String token = prefs.getString(Constant.OAUTH_TOKEN,"");
  45. String secret = prefs.getString(Constant.OAUTH_TOKEN_SECRET,"");
  46. if (null != token && null != secret && token.length()>0 && secret.length()>0){
  47. AccessToken a = new AccessToken(token,secret);
  48. mTwitter.setOAuthAccessToken(a);
  49. try {
  50. mTwitter.getAccountSettings();
  51. keys.User_Id = mTwitter.getScreenName();
  52. ret = true;
  53. } catch (TwitterException e) {
  54. ret = false;
  55. }
  56. }
  57. }
  58. return ret;
  59. }
  60.  
  61. public void AuthTwitter(){
  62.  
  63. // First check if Account manager has valid token
  64. // Result of this is send in MSG
  65. CheckAccManagerForTwitter();
  66.  
  67. }
  68.  
  69.  
  70. public Twitter getTwitter(){
  71. return mTwitter;
  72. }
  73.  
  74. private boolean CheckAccManagerForTwitter(){
  75.  
  76. AccountManager am = AccountManager.get(mActivity);
  77. Account[] accts = am.getAccountsByType("com.twitter.android.auth.login");
  78. if(accts.length > 0) {
  79. Account acct = accts[0];
  80.  
  81. am.getAuthToken(acct,"com.twitter.android.oauth.token",null,mActivity,new AccountManagerCallback<Bundle>() {
  82.  
  83. @Override
  84. public void run(AccountManagerFuture<Bundle> arg0) {
  85. try {
  86. Bundle b = arg0.getResult();
  87. String token = b.getString(AccountManager.KEY_AUTHTOKEN);
  88. String userName = b.getString(AccountManager.KEY_ACCOUNT_NAME);
  89. handler.sendMessage(handler.obtainMessage(MSG_GOT_AUTH_TOKEN,token));
  90. }
  91. catch (Exception e) {
  92. Log.e(TAG,"EXCEPTION@AUTHTOKEN");
  93. handler.sendEmptyMessage(MSG_NO_AUT_TOKEN_RECVD);
  94. }
  95. }},null);
  96.  
  97. am.getAuthToken(acct,"com.twitter.android.oauth.token.secret",new AccountManagerCallback<Bundle>() {
  98.  
  99. @Override
  100. public void run(AccountManagerFuture<Bundle> arg0) {
  101. try {
  102. Bundle b = arg0.getResult();
  103. String secret = b.getString(AccountManager.KEY_AUTHTOKEN);
  104. handler.sendMessage(handler.obtainMessage(MSG_GOT_AUTH_SECRET,secret));
  105.  
  106. }
  107. catch (Exception e) {
  108. Log.e(TAG,"EXCEPTION@AUTHTOKEN");
  109. handler.sendEmptyMessage(MSG_NO_AUT_TOKEN_RECVD);
  110. }
  111. }},null);
  112. //
  113. }
  114. else{
  115. // No twitter account found in Account Manager
  116. Log.e(TAG,"No Twitter account in Account manager");
  117. handler.sendEmptyMessage(MSG_NO_AUT_TOKEN_RECVD);
  118.  
  119. }
  120.  
  121. return true;
  122. }
  123.  
  124. class MessageHandler extends Handler {
  125. String token = null;
  126. String secret = null;
  127. @Override
  128. public void handleMessage(Message msg) {
  129. if (msg.what == MSG_GOT_AUTH_TOKEN | msg.what ==MSG_GOT_AUTH_SECRET){
  130. if (msg.what == MSG_GOT_AUTH_TOKEN){
  131. token = (String)msg.obj;
  132. }
  133. else if (msg.what == MSG_GOT_AUTH_SECRET){
  134. secret = (String)msg.obj;
  135. }
  136. if (null != token && null != secret){
  137. AccessToken accesstoken = new AccessToken(token,secret);
  138. mTwitter.setOAuthAccessToken(accesstoken);
  139. try {
  140. mTwitter.getAccountSettings();
  141. keys.User_Id = mTwitter.getScreenName();
  142. } catch (Exception e) {
  143. // That means Authentication Failed
  144. // So fall back to web login
  145. Intent i = new Intent(mActivity.getApplicationContext(),PrepareRequestTokenActivity.class);
  146. mActivity.startActivity(i);
  147. }
  148. }
  149.  
  150. }
  151. else if (msg.what == MSG_NO_AUT_TOKEN_RECVD){
  152. // That means There is no twiter account with Account Manager
  153. // So fall back to web login
  154. Intent i = new Intent(mActivity.getApplicationContext(),PrepareRequestTokenActivity.class);
  155. mActivity.startActivity(i);
  156. }
  157. }
  158. }
  159.  
  160.  
  161.  
  162. public void logoutTwiter(){
  163.  
  164.  
  165. }
  166.  
  167. }

解决方法

Android的AccountManager返回的com.twitter.android.oauth.token和com.twitter.android.oauth.token.secret凭据仅使用Twitter的官方消费者密钥和密钥进行身份验证. AFAIK他们对第三方开发人员实际上并没有用.

关于Twitter我只会说官方的消费者密钥/密钥对是“在那里”,如果Twitter通过应用程序更新改变它们,他们将为没有该应用程序更新的每个用户打破OAuth.

猜你在找的Android相关文章