2011-11-29 15 views
6

quello che ho provato:Android: Login con Twitter utilizzando Twitter4J

ho già registrato un app twitter e ottenuto chiave consumatore e Secret.Even ho avuto vari codici di login con twitter.These sono quello che ho hanno provato da:

http://thetechnib.blogspot.com/2011/01/android-sign-in-with-twitter.html

[Questo link è morto, è possibile visualizzare un archivio here]
http://www.android10.org/index.php/articleslibraries/291-twitter-integration-in-your-android-application

problema che ho:

Fino ad ora, sopra il codice mi porta a Twitter Login e mi permetta di accedere e avere un PIN per completare l'process.But login Non ho idea di come usarlo per ottenere la mia app funzionava. Ho controllato l'intero codice ma non ho trovato nulla relativo al pin.

In secondo luogo, quando ho registrato il mio app su twitter, ha chiesto per richiamata URL, ma come è stato scritto, che non è davvero necessario, ho saltato specificando. (Anche io non so quello che dovrebbe essere!)

E quindi, sto dando null come CallbackURL nella mia app.

Qualcuno mi può suggerire, come posso utilizzare questo PIN per completare la procedura di accesso e riportare l'utente all'attività principale della mia app? È l'url di callback che sta causando problemi o qualcos'altro che sto facendo male in?

Si prega di rispondere.Qualsiasi aiuto appriciato! Grazie.

EDIT:

Come suggerito da Frankenstein, ho provato il codice a github.com/ddewaele/AndroidTwitterSample/downloads

ho aggiunto la mia chiave e il segreto consumatore con callback url:

public static final String OAUTH_CALLBACK_SCHEME= "x-oauthflow-twitter"; 
public static final String OAUTH_CALLBACK_HOST= "callback"; 
public static final String OAUTH_CALLBACK_URL= OAUTH_CALLBACK_SCHEME + "://" + OAUTH_CALLBACK_HOST; 

ma mi dà questo errore:

Logcat:

11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081): Error during OAUth retrieve request token 
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081): oauth.signpost.exception.OAuthNotAuthorizedException: Authorization failed (server replied with a 401). This can happen if the consumer key was not correct or the signatures did not match. 
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081): at oauth.signpost.AbstractOAuthProvider.handleUnexpectedResponse(AbstractOAuthProvider.java:239) 
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081): at oauth.signpost.AbstractOAuthProvider.retrieveToken(AbstractOAuthProvider.java:189) 
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081): at oauth.signpost.AbstractOAuthProvider.retrieveRequestToken(AbstractOAuthProvider.java:69) 
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081): at com.ecs.android.sample.twitter.OAuthRequestTokenTask.doInBackground(OAuthRequestTokenTask.java:55) 
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081): at com.ecs.android.sample.twitter.OAuthRequestTokenTask.doInBackground(OAuthRequestTokenTask.java:1) 
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081): at android.os.AsyncTask$2.call(AsyncTask.java:185) 
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
11-29 11:56:56.249: E/com.ecs.android.sample.twitter.OAuthRequestTokenTask(3081): at java.lang.Thread.run(Thread.java:1096) 

Mostra anche lo schermo nero quando faccio clic sul pulsante TWEET, invece di portarmi ad accedere alla schermata di Twitter.

Omg, sto per diventare pazzo ... ci provano da due giorni! :(si prega di aiutare

+0

Si sta già gestendo il ritorno dal processo di autorizzazione e memorizzato il token di accesso? – jmcdale

+0

Beh ... Non so se salva token o meno nel codice perché sono nuovo di OAuth. Ma guardando il codice, non credo che il token venga salvato. – Hiral

risposta

9

È perché l'app è registrata come client desktop. Per sovrascrivere l'URL di richiamata, è necessario che la tua app sia registrata come client browser.

Provare a configurare un URL fittizio di richiamata (http://example.com/ o quello che volete) a https://dev.twitter.com/apps/[appid]/settings> Callback URL e la tua app sarà riconosciuto come client browser.

Quindi provare @Frankenstein o @ codice jamn224.

+0

mi ha salvato i miei momenti faticosi ... grazie –

5

si dovrebbe scrivere di callback come questo in palese alla vostra attività

<activity android:name="com.apps.twitter.PrepareRequestTokenActivity" 
      android:launchMode="singleTask" android:theme="@android:style/Theme.Translucent.NoTitleBar" 
      android:screenOrientation="portrait"> 
      <intent-filter> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
      <intent-filter> 
       <action android:name="android.intent.action.VIEW" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
       <category android:name="android.intent.category.BROWSABLE" /> 
       <data android:scheme="x-oauthflow-twitter" android:host="callback" /> 
      </intent-filter> 
</activity> 

e nel file Constant

final public static String CALLBACK_SCHEME = "x-oauthflow-twitter";  
final public static String CALLBACK_URL = CALLBACK_SCHEME + "://callback"; 
+0

Ho provato questo con il codice specificato nel secondo link di riferimento della mia domanda. Ma sfortunatamente, non funziona per me. :(comunque, grazie – Hiral

+0

Dando anche "" come CallbackURL mi consente di accedere con twitter ma sono solo bloccato, non so cosa fare con il PIN per completare la procedura di accesso. – Hiral

+0

Grazie per il Risposta: cercherò sicuramente di fartelo sapere – Hiral

7

In primo luogo, è necessario autenticarsi correttamente:.

try{ 
     consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET); 
     provider = new DefaultOAuthProvider("http://twitter.com/oauth/request_token", "http://twitter.com/oauth/access_token", "http://twitter.com/oauth/authorize"); 
     String authUrl = provider.retrieveRequestToken(consumer, CALLBACK_URL); 

     startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl))); 

    }catch(Exception e){ 
     Log.e(TAG,e+""); 
    } 

Le necessità per CALLBACK_URL devono essere impostate nel file Manifest (fare riferimento a Frankenste in risposta).Il codice sopra riportato inizia l'intento di eseguire l'autorizzazione sul server di Twitter. Le informazioni di callback sono necessarie in modo che l'intento sappia a quale app restituire dopo la procedura di autorizzazione.

allora abbiamo bisogno di gestire il ritorno alla applicazione dopo l'autenticazione su Twitter:

@Override 
public void onResume(){ 
    super.onResume(); 

    if (this.getIntent()!=null && this.getIntent().getData()!=null){ 
     Uri uri = this.getIntent().getData(); 

     //handle returning from authenticating the user 
     if (uri != null && uri.toString().startsWith(CALLBACK_URL)) { 
      String verifier = uri.getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER); 
      String token = uri.getQueryParameter(oauth.signpost.OAuth.OAUTH_TOKEN); 
      try { 
       Twitter t = new TwitterFactory().getInstance(); 
       t.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET); 

       // Get Access Token and store it 
       rToken = new RequestToken(token, CONSUMER_SECRET); 
       AccessToken aToken = t.getOAuthAccessToken(rToken); 
       storeAccessToken(aToken); 

       //send to checkLoginState again since we have authorization now! 
       checkLoginState(); 

      } catch (Exception e) { 
       Log.e(TAG, e+""); 
      } 
      } 
     } 
}//end onResume 

Questo codice prende i dati dal intento di ritorno, tra i quali è l'informazioni per afferrare il token di autorizzazione. "storeAccessToken (aToken)" è un metodo breve che ho scritto che memorizza il token nelle preferenze dell'app in modo che non sia necessario riautorizzarlo ogni volta che l'app viene aperta.

Ora che abbiamo un token di autorizzazione, possiamo usarlo autorizzare un'istanza Twitter:

twitter = new TwitterFactory().getInstance(); 
     twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET); 
     twitter.setOAuthAccessToken(aToken); 

La variabile sopra "Twitter" è ora autorizzato e possiamo fare la sua cosa.

+0

Grazie per la risposta.Vederò a questo: – Hiral

+0

Oops ... una cosa importante da ricordare è che sto usando le librerie di segnaletica open source per l'assistenza con le procedure di oAuth. Io uso la biblioteca di comuni e la libreria principale, entrambi i quali possono essere trovati [qui] (http://code.google.com/p/oauth-signpost/downloads/list) – jmcdale

+0

Puoi dirmi come conservare il token? Voglio dire, puoi darmi codici di metodi storeAccessToken (aToken) e checkLoginState() pure? – Hiral

Problemi correlati