2010-12-08 7 views
2

Ich versuche, Twitter in meine App zu integrieren, aber ich kann es nicht funktionieren.CallBack nach Twitter-Authentifizierung

Dies ist mein Code:

public class OAuthForTwitter extends Activity { 

    private CommonsHttpOAuthConsumer httpOauthConsumer; 
    private OAuthProvider httpOauthprovider; 
    public final static String consumerKey = "xxxxxxxxxxxxxx"; 
    public final static String consumerSecret = "xxxxxxxxxxxx"; 
    private final String CALLBACKURL = "sosInternational:///HierBenIkNu"; 
    private Twitter twitter; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     doOAuth(); 
    } 

    /** 
    * Opens the browser using signpost jar with application specific 
    * consumerkey and consumerSecret. 
    */ 

    private void doOAuth() { 
     try { 
      httpOauthConsumer = new CommonsHttpOAuthConsumer(consumerKey, consumerSecret); 
      httpOauthprovider = new DefaultOAuthProvider(
        "http://twitter.com/oauth/request_token", 
        "http://twitter.com/oauth/access_token", 
        "http://twitter.com/oauth/authorize"); 
      String authUrl = httpOauthprovider.retrieveRequestToken(httpOauthConsumer, CALLBACKURL); 
      this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl))); 
     } catch (Exception e) { 
      Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); 
     } 
    } 

    @Override 
    protected void onNewIntent(Intent intent) { 

     super.onNewIntent(intent); 

     Uri uri = intent.getData(); 
     if (uri != null && uri.toString().startsWith(CALLBACKURL)) { 

      String verifier = uri 
        .getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER); 

      try { 
       // this will populate token and token_secret in consumer 

       httpOauthprovider.retrieveAccessToken(httpOauthConsumer, 
         verifier); 

       // TODO: you might want to store token and token_secret in you 
       // app settings!!!!!!!! 

       AccessToken a = new AccessToken(httpOauthConsumer.getToken(), 
         httpOauthConsumer.getTokenSecret()); 

       // initialize Twitter4J 

       twitter = new TwitterFactory().getInstance(); 
       twitter.setOAuthConsumer(consumerKey, consumerSecret); 
       twitter.setOAuthAccessToken(a); 

       // create a tweet 

       Date d = new Date(System.currentTimeMillis()); 
       String tweet = "#OAuth working! " + d.toLocaleString(); 

       // send the tweet 

       twitter.updateStatus(tweet); 

      } catch (Exception e) { 

       Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); 
      } 

     } 
    } 
} 

Wenn ich auf der Twitter-Seite getan Authentifizierung, sollte es mich an die App umleiten zurück.

Aber stattdessen erhalte ich diese Seite nicht gefunden:

alt text

ich dies habe in meinem AndroidManifest:

<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="sosInternational" android:host="HierBenIkNu"></data> 
    </intent-filter> 

Wie kann ich zurück zu meiner App mit den Tasten gehe ich bekommen zurück?

+5

Das nächste Mal, bitte ** entfernen ** Verbraucherschlüssel und Verbrauchergeheimnis. Dies kann von böswilligen Entwicklern verwendet werden. Ich habe es für dich entfernt. –

+0

Wow, das war sehr dumm von mir. Danke für die Warnung! – Galip

+0

Nun, zu spät, es ist in der Geschichte sichtbar. Ändern Sie Ihre Schlüssel so schnell wie möglich. –

Antwort

7

Ok, es war ein ziemlich dummer Fehler.

Mein <intent-filter> war nicht innerhalb einer Anwendung ..

Dies ist, wie es jetzt ist:

<activity 
     android:name=".OAuthForTwitter" 
     android:label="@string/app_name" 
     android:configChanges="orientation|keyboardHidden" 
     android:launchMode="singleInstance"> 
     <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="sosInternational" android:host="OAuthForTwitter"></data> 
     </intent-filter> 
    </activity> 

Diese Art ab Werk, es lädt einfach die ganze App von Anfang an.

Gibt es keine Möglichkeit, einfach zur letzten Aktivität zurückzukehren, ohne die gesamte App neu zu starten?

+1

singleInstance, das war mein Fehler! Danke! – gilm

0

Ihre Rückruf-URL sollte "sosInternational: // HierBenIkNu" (statt "sosInternational: /// HierBenIkNu") im Java-Code sein.

private final String CALLBACKURL = "sosInternational://HierBenIkNu"; 
5

Ich habe das gelöst. Nicht genau so, wie du es entwickelt hast, aber ein etwas anderer Weg. Hier sind die Schritte, die beschreiben, was ich getan habe.

  1. Verwendung webview statt es in Web-Browser zu öffnen: Eine der entscheidenden Vorteil dabei ist, können Sie die URL umleitet verfolgen.

  2. Anruf setWebViewClient Methode Ihrer Webansicht und Override shouldOverrideUrlLoading Methode Ihrer Klasse, ich habe innere Klasse verwendet.

  3. Sie haben URL-Parameter in Ihrer Methode. Überprüfen Sie, ob es mit Ihrer eigenen Rückruf-URL beginnt oder nicht (Hinweis: Diese URL enthält ein Benutzer-Token und ein Benutzer-Geheimnis, das für die Autorisierung erforderlich ist).

  4. Nachdem Sie Ihre Aufgabe abgeschlossen haben, können Sie die Aktivität verbergen oder das WebView oder etwas, das Sie wünschen, entfernen.

EDIT: Das ist die Art und Weise oAuth in der Regel in Web-Anwendung verwendet, so dass wir nicht XAUTH Weg brauchen. (Wenn andere Community-Mitglieder nicht wissen)

Ich hoffe, es wird Ihnen helfen.