2011-01-10 13 views
5

पिछले 5 दिनों से मैं ओएथ का उपयोग करके एंड्रॉइड में ट्विटर के लिए कोड का सबसे अच्छा काम करने वाला पासा खोज रहा हूं ... मुझे बहुत कुछ मिला। लेकिन एक भी 1 पूरी तरह से चल रहा है। कोई भी मुझे कुछ कोड कैसे मिलता है। यह काम कर रहा है लेकिन मुझे एक समस्या है। मुझे आश्चर्य है कि मुझे स्ट्रिंग कॉलबैक = "?" में क्या लिखना है ताकि मेरा एंड्रॉइड ब्राउज़र मुझे प्रमाणीकरण के बाद वहां रहने के बजाए मेरे आवेदन पर वापस भेज देगा .. अगर मैं कॉलबैक का उपयोग नहीं कर रहा हूं और OAuth.OUT_OF_BAND का उपयोग करता हूं तो ब्राउज़र एक पिन कोड दिखाता है और खुराक ब्राउज़र को मेरे एप्लिकेशन पर वापस रीडायरेक्ट नहीं करता है। कृपया मुझे यह बताने में सहायता करें कि मैं क्या गलत कर रहा हूं।ट्विटर के लिए OAuth का उपयोग करके मैं एंड्रॉइड में वापस कैसे कॉल कर सकता हूं?

यहाँ मेरी कोड चला जाता है

package com.example.tweeter; 

import oauth.signpost.OAuth; 
import oauth.signpost.OAuthProvider; 
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer; 
import oauth.signpost.commonshttp.CommonsHttpOAuthProvider; 
import oauth.signpost.exception.OAuthCommunicationException; 
import oauth.signpost.exception.OAuthExpectationFailedException; 
import oauth.signpost.exception.OAuthMessageSignerException; 
import oauth.signpost.exception.OAuthNotAuthorizedException; 

import org.apache.http.client.HttpClient; 
import org.apache.http.impl.client.DefaultHttpClient; 

import android.app.Activity; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 

public class Tweeter extends Activity { 

    private String CONSUMER_KEY = "CONSUMER_KEY"; 
    private String CONSUMER_SECRET = "CONSUMER_SECRET"; 
    private static final Uri CALLBACK_URI = Uri.parse("PicPuzzle://tkxel"); 
    private String CALLBACK_URL = "PicPuzzle://tkxel"; 
    OAuthProvider provider ; 
    CommonsHttpOAuthConsumer consumer ; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     consumer = new CommonsHttpOAuthConsumer(
       CONSUMER_KEY, CONSUMER_SECRET); 

     provider = new CommonsHttpOAuthProvider(
       "http://twitter.com/oauth/request_token", 
       "http://twitter.com/oauth/access_token", 
       "http://twitter.com/oauth/authorize"); 
     provider.setOAuth10a(true); 

     HttpClient client = new DefaultHttpClient(); 

     String authUrl = "http://www.yahoo.com"; 
     try { 

      //This line work perfect but it not redirect me to my application 
      authUrl = provider.retrieveRequestToken(consumer, OAuth.OUT_OF_BAND); 

      //I want to send a calll back but It give exception 
      ///*** authUrl = provider.retrieveRequestToken(consumer, CALLBACK_URI.toString()); 

     } catch (OAuthMessageSignerException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (OAuthNotAuthorizedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (OAuthExpectationFailedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (OAuthCommunicationException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl))); 
    } 

    @Override 
    protected void onResume() { 
     // this must be places in activity#onResume() 
     Uri uri = this.getIntent().getData(); 
     if (uri != null && uri.toString().startsWith(CALLBACK_URL)) { 
      String verifier = uri.getQueryParameter("oauth_verifier"); 
      // this will populate token and token_secret in consumer 
      try { 
       provider.retrieveAccessToken(consumer, verifier); 
      } catch (OAuthMessageSignerException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (OAuthNotAuthorizedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (OAuthExpectationFailedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (OAuthCommunicationException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     super.onResume(); 
    } 
} 

और मेरे AndroidManifest.xml नज़र इस

<uses-permission 
    android:name="android.permission.INTERNET"/> 
<application 
    android:icon="@drawable/icon" 
    android:label="@string/app_name" 
> 
    <activity 
     android:name=".Tweeter" 
     android:label="@string/app_name" 
    > 
     <intent-filter> 
      <action 
       android:name="android.intent.action.MAIN"/> 
      <category 
       android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
    </activity> 
    <intent-filter> 
     <action 
      android:name="android.intent.action.VIEW" 
     ></action> 
     <category 
      android:name="android.intent.category.DEFAULT" 
     ></category> 
     <category 
      android:name="android.intent.category.BROWSABLE" 
     ></category> 
     <data 
      android:scheme="PicPuzzle" 
      android:host="tkxel" 
     ></data> 
    </intent-filter> 
</application> 
<uses-sdk 
    android:minSdkVersion="7"/>`enter code here` 

उत्तर

7

कॉलबैक URL कि जो आप प्रकट में अपनी गतिविधि के लिए कॉन्फ़िगर पर आधारित होना चाहिए की तरह। ऐसा लगता है कि आप scheme="PicPuzzle", host="tkxel" का उपयोग कर रहे हैं। तो आपका कॉलबैक यूआरएल PicPuzzle://tkxel

मुझे लगता है कि <data> टैग विशेष पर होना चाहिए, हालांकि आप कॉलबैक प्राप्त करना चाहते हैं (जैसा कि आपके पास इस समय पूरे एप्लिकेशन पर है)।

+0

मैं इसे आजमाता हूं लेकिन अभी भी कोई समाधान नहीं है ...! यह हमेशा त्रुटि दिखाता है oauth.signpost.exception.OAuthNotAuthorizedException: प्रमाणीकरण विफल रहा (सर्वर ने 401 के साथ उत्तर दिया)। यह तब हो सकता है जब उपभोक्ता कुंजी सही नहीं थी या हस्ताक्षर मेल नहीं खाते थे। 01-10 16: 53: 20.614: WARN/System.err (5447): oauth.signpost.AbstractOAuthProvider.handleUnexpectedResponse (AbstractOAuthProvider.java3939) 01-10 16: 53: 20.614: WARN/System.err (5447): oauth.signpost.AbstractOAuthProvider.retrieve टोकन (AbstractOAuthProvider.java:189) – Arslan

+0

मैंने आपके कोड पर नजदीकी नजर डाली है। मैं कुछ संभावित मुद्दों को देख सकता हूं: - संदेश हस्ताक्षरकर्ता: "consumer.setMessageSigner (नया HmacSha1MessageSigner()) के साथ सेट करें;" - एक्सेस टोकन पुनर्प्राप्त करना। सत्यापनकर्ता के लिए "OAuth.OAUTH_VERIFIER" का उपयोग करें (हालांकि यह शायद वही बात है। – ShibbyUK

+0

विचार के लिए धन्यवाद .... लेकिन यह कोड कहां रखना है? संदेश हस्ताक्षरकर्ता: "उपभोक्ता.सेट मैसेज सिग्नेर (नया HmacSha1 संदेश संदेश) (") के साथ सेट करें; " – Arslan

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

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