Conexión a Android con Twitter – Obtener respuesta nula de twitter

Tengo un problema de% & $ 5 # ~ ​​€ con la conexión a twitter. (El código se publica debajo de este)

En primer lugar, he configurado todas (claves de twitter, devolución de llamada en el manifiesto, etc), luego hago la llamada a twitter y obtener el navegador abierto, luego firmo en twitter y acepto la aplicación, a continuación, el navegador vuelve a la aplicación y tratar de Obtener la respuesta de twitter, pero tengo NULL como respuesta.

¿Puede alguien ayudarme a encontrar lo que está pasando con esto?

Grettings

PD: Sigo este tutorial: http://www.androidhive.info/2012/09/android-twitter-oauth-connect-tutorial/

PD 2: Algunas personas piensan que el problema es la fecha y hora del teléfono ( https://dev.twitter.com/discussions/374 ), pero he cambiado eso y no funciona

import twitter4j.Twitter; import twitter4j.TwitterException; import twitter4j.TwitterFactory; import twitter4j.User; import twitter4j.auth.AccessToken; import twitter4j.auth.RequestToken; import twitter4j.conf.Configuration; import twitter4j.conf.ConfigurationBuilder; import android.annotation.SuppressLint; import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.StrictMode; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; import android.widget.Toast; @SuppressLint("NewApi") public class TwitterActivity extends Activity { Intent TWITTER_INTENT = null; //TWITTER THINGS static String TWITTER_CONSUMER_KEY = "CONSUMER_KEY_HERE"; static String TWITTER_CONSUMER_SECRET = "CONSUMER_SECRET_HERE"; static final String TWITTER_CALLBACK_URL = "oauth://t4jsample"; // Twitter oauth urls static final String URL_TWITTER_AUTH = "https://api.twitter.com/oauth/authorize"; static final String URL_TWITTER_OAUTH_VERIFIER = "https://api.twitter.com/oauth/access_token"; static final String URL_TWITTER_OAUTH_TOKEN = "https://api.twitter.com/oauth/request_token"; // Progress dialog ProgressDialog pDialog; // Twitter public static Twitter twitter; public static String twitter_token, twitter_secret; // Internet Connection detector private ConnectionDetector cd; // Alert Dialog Manager AlertDialogManager alert = new AlertDialogManager(); // Preference Constants static String PREFERENCE_NAME = "twitter_oauth"; static final String PREF_KEY_OAUTH_TOKEN = "oauth_token"; static final String PREF_KEY_OAUTH_SECRET = "oauth_token_secret"; static final String PREF_KEY_TWITTER_LOGIN = "isTwitterLogedIn"; // Twitter private static RequestToken requestToken; // Shared Preferences private static SharedPreferences mSharedPreferences; @SuppressLint("NewApi") @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_twitter); if (Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); } //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); cd = new ConnectionDetector(getApplicationContext()); // Check if Internet present if (!cd.isConnectingToInternet()) { // Internet Connection is not present alert.showAlertDialog(TwitterActivity.this, "Internet Connection Error","Please connect to working Internet connection", false); // stop executing code by return return; } // Check if twitter keys are set if(TWITTER_CONSUMER_KEY.trim().length() == 0 || TWITTER_CONSUMER_SECRET.trim().length() == 0){ // Internet Connection is not present alert.showAlertDialog(TwitterActivity.this, "Twitter oAuth tokens", "Please set your twitter oauth tokens first!", false); // stop executing code by return return; } // Shared Preferences mSharedPreferences = getApplicationContext().getSharedPreferences("MyPref", 0); ImageView TW = (ImageView) findViewById(R.id.twitter_boton); TW.setClickable(true); TW.setOnClickListener(new OnClickListener(){ public void onClick(View v){ loginToTwitter(); } }); /** This if conditions is tested once is * redirected from twitter page. Parse the uri to get oAuth * Verifier * */ if (!isTwitterLoggedInAlready()) { Uri uri = getIntent().getData(); if (uri != null && uri.toString().startsWith(TWITTER_CALLBACK_URL)) { // oAuth verifier String verifier = uri.getQueryParameter(URL_TWITTER_OAUTH_VERIFIER); try { // Get the access token AccessToken accessToken = twitter.getOAuthAccessToken( requestToken, verifier); // Shared Preferences Editor e = mSharedPreferences.edit(); // After getting access token, access token secret // store them in application preferences e.putString(PREF_KEY_OAUTH_TOKEN, accessToken.getToken()); e.putString(PREF_KEY_OAUTH_SECRET, accessToken.getTokenSecret()); // Store login status - true e.putBoolean(PREF_KEY_TWITTER_LOGIN, true); e.commit(); // save changes Log.e("Twitter OAuth Token", "> " + accessToken.getToken()); // Getting user details from twitter // For now i am getting his name only long userID = accessToken.getUserId(); User user = twitter.showUser(userID); String username = user.getName(); Log.d("nombre",username); } catch (Exception e) { // Check log for login errors Log.e("Twitter Login Error", "> " + e.toString()); Log.e("Twitter Login Error", "> " + e.getMessage()); } } } } /** * Function to login twitter * */ private void loginToTwitter() { // Check if already logged in if (!isTwitterLoggedInAlready()) { ConfigurationBuilder builder = new ConfigurationBuilder(); builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY); builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET); Configuration configuration = builder.build(); TwitterFactory factory = new TwitterFactory(configuration); twitter = factory.getInstance(); if(!(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)) { try { requestToken = twitter.getOAuthRequestToken(TWITTER_CALLBACK_URL); this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(requestToken.getAuthenticationURL()))); } catch (TwitterException e) { e.printStackTrace(); } } else { new Thread(new Runnable() { public void run() { try { requestToken = twitter.getOAuthRequestToken(TWITTER_CALLBACK_URL); TwitterActivity.this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(requestToken.getAuthenticationURL()))); } catch (TwitterException e) { e.printStackTrace(); } } }).start(); } } else { // user already logged into twitter Toast.makeText(getApplicationContext(), "Already Logged into twitter", Toast.LENGTH_LONG).show(); } } /** * Function to update status * */ class updateTwitterStatus extends AsyncTask<String, String, String> { /** * Before starting background thread Show Progress Dialog * */ @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(TwitterActivity.this); pDialog.setMessage("Updating to twitter..."); pDialog.setIndeterminate(false); pDialog.setCancelable(false); pDialog.show(); } /** * getting Places JSON * */ protected String doInBackground(String... args) { Log.d("Tweet Text", "> " + args[0]); String status = args[0]; try { ConfigurationBuilder builder = new ConfigurationBuilder(); builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY); builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET); // Access Token String access_token = mSharedPreferences.getString(PREF_KEY_OAUTH_TOKEN, ""); // Access Token Secret String access_token_secret = mSharedPreferences.getString(PREF_KEY_OAUTH_SECRET, ""); AccessToken accessToken = new AccessToken(access_token, access_token_secret); Twitter twitter = new TwitterFactory(builder.build()).getInstance(accessToken); // Update status twitter4j.Status response = twitter.updateStatus(status); Log.d("Status", "> " + response.getText()); } catch (TwitterException e) { // Error in updating status Log.d("Twitter Update Error", e.getMessage()); } return null; } /** * After completing background task Dismiss the progress dialog and show * the data in UI Always use runOnUiThread(new Runnable()) to update UI * from background thread, otherwise you will get error * **/ protected void onPostExecute(String file_url) { // dismiss the dialog after getting all products pDialog.dismiss(); // updating UI from Background Thread runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "Status tweeted successfully", Toast.LENGTH_SHORT) .show(); // Clearing EditText field } }); } } /** * Check user already logged in your application using twitter Login flag is * fetched from Shared Preferences * */ private boolean isTwitterLoggedInAlready() { // return twitter login status from Shared Preferences return mSharedPreferences.getBoolean(PREF_KEY_TWITTER_LOGIN, false); } protected void onResume() { super.onResume(); } } 

Después de pasar horas leyendo documentación (no tengo ojos ahora), cuando trato de obtener el access_token llamo a esto:

 // Get the access token AccessToken accessToken = twitter.getOAuthAccessToken(requestToken, verifier); 

Paso el verificador (que es el pase pin, pero el pasador no es usar más) y él es nulo porque no usa más para twitter, entonces solo necesito reescribir eso con esto:

 // Get the access token AccessToken accessToken = twitter.getOAuthAccessToken(requestToken); 

Sólo necesita el requestToken para obtener el access_token.

Espero que esto ayude a cualquiera que tenga el mismo problema.

Grettings.

Miré a través de su código (debido al problema similar) y encontré un error. Mira, cuando se devuelve el foco a la aplicación de nuevo, después de recibir requestToken, intenta obtener oAuth verifier con un valor constante incorrecto.

 String verifier = uri.getQueryParameter(URL_TWITTER_OAUTH_VERIFIER); 

Donde URL_TWITTER_OAUTH_VERIFIER en su código es

 URL_TWITTER_OAUTH_VERIFIER = "https://api.twitter.com/oauth/access_token" (!) 

Pero debe establecer en getQueryParameter(OAUTH_VERIFIER); Otro valor

 OAUTH_VERIFIER = = "oauth_verifier"; 

Y su código se convirtió completamente correcto!

Y la solución que fue sugerida por JosephCastro para mí no está funcionando.

  • Retweet usando Twitter4j Android
  • 403: La solicitud se entiende, mensaje - SSL es necesario código - 92, pero se ha rechazado Twitter Android
  • ¿Cómo arreglar NoClassDefFoundError en twitter4j usando Android Studio?
  • Twitter4J + Android: El desafío de autenticación es una excepción nula
  • Android twitter4j - ¿Cómo compartir la imagen remota?
  • Cerrar la ventana del navegador después de iniciar sesión en twitter android con twitter4J
  • Twitter4j getOAuthRequestToken () con la URL de devolución de llamada falla en Android?
  • Uso de Twitter4j en android, obteniendo errores de pelusa en la biblioteca - Referencia de paquete no válida en la biblioteca
  • Android: Inicia sesión con Twitter usando Twitter4J
  • ¿Cómo puedo obtener una línea de tiempo pública de Twitter sin autenticación de usuario usando Twitter4j?
  • Twitter no funciona con twitter4j en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.