2011-06-14 23 views
7

मैं एक एंड्रॉइड एप्लिकेशन विकसित कर रहा हूं और ट्विटर को एकीकृत करना चाहता हूं।एंड्रॉइड के खाता प्रबंधक वर्गों के माध्यम से ट्विटर प्रमाणीकरण

मुझे समझ में आता है कि उपयोगकर्ता के डिवाइस पर, आधिकारिक एंड्रॉइड ट्विटर ऐप स्थापित है तो हम खाता प्रबंधक का उपयोग here के रूप में प्रमाणित कर सकते हैं .. और यदि स्थापित नहीं है तो ट्विटर लॉगिन वेब पेज दिखाएं।

क्या मेरी समझ सही है?

अब ट्विटर वेब लॉगिन पेज का उपयोग कर प्रमाणीकरण ठीक काम कर रहा है। लेकिन मैं खाता प्रबंधक का उपयोग करके लॉगिन कैसे करूं?

मैं "के रूप में com.twitter.android.auth.login" AccountsType का उपयोग से • com.twitter.android.oauth.token • com.twitter.android.oauth टोकन और टोकन को गुप्त का उपयोग कर खाता प्रबंधक मिला है। token.secret

मैं ट्विटर 4 जे का उपयोग कर रहा हूं, और मेरे CONSUMER_KEY & CONSUMER_SECRET के साथ recvd के साथ प्रमाणीकरण कर रहा हूं। टोकन। लेकिन प्रमाणीकरण हमेशा विफल रहता है।

CONSUMER_KEY & CONSUMER_SECRET जब मैं ट्विटर पर ऐप पंजीकृत करता हूं तो मुझे मिली चाबियां मिलती हैं ... लेकिन मुझे नहीं पता कि मैं इन चाबियों का आधिकारिक एंड्रॉइड ट्विटर ऐप प्रमाणीकरण के साथ कैसे उपयोग कर सकता हूं?

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, "[email protected]"); 
         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, "[email protected]"); 
          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(){ 


    } 

} 

उत्तर

1

अच्छी तरह से आप वास्तव में एक टोकन प्राप्त करने के रहस्य और उपभोक्ता कुंजी का उपयोग है। एंड्रॉइड खातों का उपयोग करके आप उन्हें टोकन प्राप्त करते हैं।

तो आम तौर पर उदाहरण के लिए ट्वीट करने के लिए आपको केवल टोकन की आवश्यकता होती है और जैसा कि मैंने कहा है कि आप इसे खाते से या twitter4j से प्राप्त करते हैं। इसलिए जब आप खातों से टोकन प्राप्त करते हैं तो आपको इसे अपने ट्विटर 4jsdk टोकन के रूप में सेट करने और नियमित रूप से एपीआई का उपयोग करने की आवश्यकता होती है।

आशा है कि यह समझ में आता है।

+0

@DArko आपकी प्रतिक्रिया के लिए धन्यवाद, मैं समझता हूं कि आप क्या कहते हैं, लेकिन समस्या यह है कि जब ट्विटर 4J में मैंने इसे एक्सेस टोकन के रूप में सेट किया, तो मुझे अपवाद मिल गया। – Naveen

+0

@DArko मैंने अपनी पोस्ट में कोड जोड़ा है, बस यह दिखाने के लिए कि मैं क्या कर रहा हूं, Pls। मुझे बताएं कि मैं कहां गलत हूं। – Naveen

+0

क्या आपने जो टोकन प्राप्त किया है उसे लॉग करने का प्रयास किया है? शायद ब्राउज़र से टोकन का उपयोग करने का प्रयास करें, देखें कि यह मान्य है या कुछ या कम से कम अगर यह सही ढंग से प्राप्त हुआ है। कोड जितना ठीक हो सकता है उतना ठीक लगता है .. – DArkO

3

com.twitter.android.oauth.token और com.twitter.android.oauth.token.secret एंड्रॉइड के खाता प्रबंधक द्वारा लौटाए गए प्रमाण-पत्र केवल ट्विटर के आधिकारिक उपभोक्ता कुंजी और गुप्त का उपयोग करके प्रमाणित करते हैं। AFAIK वे वास्तव में तीसरे पक्ष के डेवलपर्स के लिए उपयोगी नहीं हैं।

ट्विटर के संबंध में मैं कहूंगा कि आधिकारिक उपभोक्ता कुंजी/गुप्त जोड़ी "वहां से बाहर" है, और यदि ट्विटर ने उन्हें ऐप अपडेट के माध्यम से बदल दिया है तो वे उस ऐप अपडेट के बिना प्रत्येक उपयोगकर्ता के लिए OAuth को तोड़ देंगे।

संबंधित मुद्दे