我正在开发一个
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.