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`
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
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
Danke für die Betrachtung .... Aber wo diesen Code zu setzen? Nachricht Unterzeichner: Set mit "consumer.setMessageSigner (new HmacSha1MessageSigner());" – Arslan