2011-01-10 2 views
5

Von den letzten 5 Tagen bin ich auf der Suche nach einem besten Arbeitspaket Code für Twitter in Android mit OAuth ... Ich habe viel gefunden. Aber keine einzige 1 läuft perfekt. Irgendwie bekomme ich etwas Code. Es funktioniert, aber ich habe ein Problem. Ich wundere mich, was ich schreiben muss String callBack = "?" so, dass mein Android-Browser mich zu meiner Anwendung zurückleiten, anstatt dort nach der Authentifizierung zu bleiben. Wenn ich kein CallBack verwende und OAuth.OUT_OF_BAND verwende, dann zeige Browser einen PIN-Code und dosiere Browser nicht zurück zu meiner Anwendung. Bitte hilf mir, mir mitzuteilen, was ich falsch mache.Wie kann ich in Android mit OAuth für Twitter zurückrufen?

Hier mein Code geht

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(); 
    } 
} 

Und mein AndroidManifest.xml aussehen wie dieses

<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` 

Antwort

7

Die Callback-URL auf, dass beruhen sollte, die Sie für Ihre Aktivität im Manifest konfigurieren. Sieht so aus, als ob Sie scheme="PicPuzzle", host="tkxel" verwenden. So Ihr Rückruf-URL ist PicPuzzle://tkxel

Ich denke, der <data> Tag auf den bestimmten Activity sein sollten Sie allerdings den Rückruf erhalten möchten (sieht aus wie Sie es auf der gesamten Anwendung im Moment).

+0

Ich versuche das aber noch keine Lösung ...! Es zeigt immer Fehler oauth.signpost.exception.OAuthNotAuthorizedException: Autorisierung fehlgeschlagen (Server antwortete mit einem 401). Dies kann passieren, wenn der Consumer Key nicht korrekt war oder die Signaturen nicht übereinstimmten. 01-10 16: 53: 20.614: WARN/System.err (5447): at oauth.signpost.AbstractOAuthProvider.handleUnexpectedResponse (AbstractOAuthProvider.java:239) 01-10 16: 53: 20.614: WARN/System.err (5447): at oauth.signpost.AbstractOAuthProvider.retrieveToken (AbstractOAuthProvider.java:189) – Arslan

+0

Ich habe mir Ihren Code genauer angesehen. Ich kann ein paar potenzielle Probleme sehen: - Nachricht Unterzeichner: Set mit "consumer.setMessageSigner (new HmacSha1MessageSigner());" - Abrufen des Zugriffstokens. Verwenden Sie "OAuth.OAUTH_VERIFIER" für den Verifizierer (obwohl dies wahrscheinlich die gleiche Sache ist. – ShibbyUK

+0

Danke für die Betrachtung .... Aber wo diesen Code zu setzen? Nachricht Unterzeichner: Set mit "consumer.setMessageSigner (new HmacSha1MessageSigner());" – Arslan