Pregunta

Lo que he probado:

Ya he registrado una aplicación en Twitter y obtuve la llave del consumidor y el secreto. Incluso obtuve varios códigos para iniciar sesión en Twitter. Estos son lo que he probado:

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

Este enlace está muerto, puede ver un archivo aquí]
http://www.android10.org/index.php/articleslibraries/291-twitter-ingration-in-your-android-application

Problema que tengo:

Hasta ahora, el código anterior me lleva al inicio de sesión de Twitter y déjame iniciar sesión y tener un PIN para completar el proceso de inicio de sesión. Pero no tengo idea de cómo usarla para que mi aplicación funcione. Revisé todo el código pero no encontré nada relacionado con alfiler.

En segundo lugar, cuando registré mi aplicación en Twitter, solicitó URL de devolución de llamada, pero como fue escrito que realmente no es necesario, me salteé especificando. (¡Incluso no sé qué debería ser!)

Y por lo tanto, estoy dando nulo como llamado en mi aplicación.

¿Alguien puede sugerirme, cómo puedo usar este PIN para completar el proceso de inicio de sesión y recuperar el usuario de la actividad principal de mi aplicación? ¿Es la URL de devolución de llamada la que está causando un problema o algo más en lo que estoy haciendo mal?

Por favor responda. ¡Cualquier ayuda apreciada! Gracias.

EDITAR :

Según lo sugerido por Frankenstein, probé código en github.com/ddewaele/androidtwittersample/downloads

Agregué mi llave de consumo y secreto del consumidor junto con la URL de devolución de llamada:

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;

Pero me da este error:

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)

También me muestra la pantalla negra cuando hago clic en el botón Tweet, en lugar de llevarme a iniciar sesión en la pantalla de Twitter.

Dios mío, voy a estar loco ... ¡lo he intentado desde dos días! :( por favor ayuda.

¿Fue útil?

Solución

Es porque su aplicación está registrada como un cliente de escritorio. Para sobrescribir la URL de devolución de llamada, su aplicación debe registrarse como cliente de navegador.

Intente configurar una URL de devolución de llamada ficticia (http://example.com/ o lo que desee) en https://dev.twitter.com/apps/imappidfont>/settings> URL de devolución de llamada y su aplicación serán reconocidas como un navegador cliente.

Luego pruebe el código @Frankenstein o @JAMN224.

Otros consejos

Primero, debe autenticarse correctamente:

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+"");
    }

Las necesidades de Callback_url deben establecerse en el archivo de manifiesto (consulte la respuesta de Frankenstein). El código anterior inicia una intención de realizar la autorización en el servidor de Twitter. La información de devolución de llamada es necesaria para que la intención sepa a qué aplicación volver después del procedimiento de autorización.

Luego necesitamos manejar el regreso a la aplicación después de autenticar en 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

Este código toma los datos de la intención de regreso, entre los cuales se encuentra la información para obtener el token de autorización. "StoreAccessToken (Atoken)" es un método corto que escribí que almacena el token en las preferencias de la aplicación para que no necesitemos reautorizar cada vez que se abre la aplicación.

Ahora que tenemos un token de autorización, podemos usarlo autorizar una instancia de Twitter:

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

La variable anterior "Twitter" ahora está autorizada y puede hacer lo suyo.

Deberías estar escribiendo devolución de llamada como esta en manifiesto a tu actividad

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

Y en el archivo constante

final public static String  CALLBACK_SCHEME = "x-oauthflow-twitter";    
final public static String  CALLBACK_URL = CALLBACK_SCHEME + "://callback";
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top