español developers developer desarrollador cuenta android twitter twitter-oauth twitter4j android-twitter

developers - Integración de Android con Twitter usando oauth y twitter4j



twitter developers documentation (5)

Resolví el problema. Hice cambios en el código que encontré en un tutorial para que funcione. Copiando todo el código aquí. Simplemente reemplace con su ConsumerKey y ConsumerSecret .

Necesita agregar la biblioteca de twitter4j a la carpeta libs su proyecto.

AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.androidhive.twitterconnect" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" /> <!-- Permission - Internet Connect --> <uses-permission android:name="android.permission.INTERNET" /> <!-- Network State Permissions --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <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:host="t4jsample" android:scheme="oauth" /> </intent-filter> </activity> </application> </manifest>

MainActivity.java:

package com.androidhive.twitterconnect; 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 com.androidhive.twitterconnect.R; import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.content.pm.ActivityInfo; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.text.Html; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { // Constants /** * Register your here app https://dev.twitter.com/apps/new and get your * consumer key and secret * */ static String TWITTER_CONSUMER_KEY = "PutYourConsumerKeyHere"; // place your cosumer key here static String TWITTER_CONSUMER_SECRET = "PutYourConsumerSecretHere"; // place your consumer secret here // 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"; static final String TWITTER_CALLBACK_URL = "oauth://t4jsample"; // Twitter oauth urls static final String URL_TWITTER_AUTH = "auth_url"; static final String URL_TWITTER_OAUTH_VERIFIER = "oauth_verifier"; static final String URL_TWITTER_OAUTH_TOKEN = "oauth_token"; // Login button Button btnLoginTwitter; // Update status button Button btnUpdateStatus; // Logout button Button btnLogoutTwitter; // EditText for update EditText txtUpdate; // lbl update TextView lblUpdate; TextView lblUserName; // Progress dialog ProgressDialog pDialog; // Twitter private static Twitter twitter; private static RequestToken requestToken; private AccessToken accessToken; // Shared Preferences private static SharedPreferences mSharedPreferences; // Internet Connection detector private ConnectionDetector cd; // Alert Dialog Manager AlertDialogManager alert = new AlertDialogManager(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); cd = new ConnectionDetector(getApplicationContext()); // Check if Internet present if (!cd.isConnectingToInternet()) { // Internet Connection is not present alert.showAlertDialog(MainActivity.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(MainActivity.this, "Twitter oAuth tokens", "Please set your twitter oauth tokens first!", false); // stop executing code by return return; } // All UI elements btnLoginTwitter = (Button) findViewById(R.id.btnLoginTwitter); btnUpdateStatus = (Button) findViewById(R.id.btnUpdateStatus); btnLogoutTwitter = (Button) findViewById(R.id.btnLogoutTwitter); txtUpdate = (EditText) findViewById(R.id.txtUpdateStatus); lblUpdate = (TextView) findViewById(R.id.lblUpdate); lblUserName = (TextView) findViewById(R.id.lblUserName); // Shared Preferences mSharedPreferences = getApplicationContext().getSharedPreferences( "MyPref", 0); /** * Twitter login button click event will call loginToTwitter() function * */ btnLoginTwitter.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // Call login twitter function loginToTwitter(); } }); /** * Button click event to Update Status, will call updateTwitterStatus() * function * */ btnUpdateStatus.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Call update status function // Get the status from EditText String status = txtUpdate.getText().toString(); // Check for blank text if (status.trim().length() > 0) { // update status new updateTwitterStatus().execute(status); } else { // EditText is empty Toast.makeText(getApplicationContext(), "Please enter status message", Toast.LENGTH_SHORT) .show(); } } }); /** * Button click event for logout from twitter * */ btnLogoutTwitter.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // Call logout twitter function logoutFromTwitter(); } }); /** 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 final String verifier = uri .getQueryParameter(URL_TWITTER_OAUTH_VERIFIER); try { Thread thread = new Thread(new Runnable(){ @Override public void run() { try { // Get the access token MainActivity.this.accessToken = twitter.getOAuthAccessToken( requestToken, verifier); } catch (Exception e) { e.printStackTrace(); } } }); thread.start(); // 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()); // Hide login button btnLoginTwitter.setVisibility(View.GONE); // Show Update Twitter lblUpdate.setVisibility(View.VISIBLE); txtUpdate.setVisibility(View.VISIBLE); btnUpdateStatus.setVisibility(View.VISIBLE); btnLogoutTwitter.setVisibility(View.VISIBLE); // 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(); // Displaying in xml ui lblUserName.setText(Html.fromHtml("<b>Welcome " + username + "</b>")); } catch (Exception e) { // Check log for login errors Log.e("Twitter Login Error", "> " + e.getMessage()); e.printStackTrace(); } } } } /** * 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(); Thread thread = new Thread(new Runnable(){ @Override public void run() { try { requestToken = twitter .getOAuthRequestToken(TWITTER_CALLBACK_URL); MainActivity.this.startActivity(new Intent(Intent.ACTION_VIEW, Uri .parse(requestToken.getAuthenticationURL()))); } catch (Exception e) { e.printStackTrace(); } } }); thread.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(MainActivity.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()); e.printStackTrace(); } 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 txtUpdate.setText(""); } }); } } /** * Function to logout from twitter * It will just clear the application shared preferences * */ private void logoutFromTwitter() { // Clear the shared preferences Editor e = mSharedPreferences.edit(); e.remove(PREF_KEY_OAUTH_TOKEN); e.remove(PREF_KEY_OAUTH_SECRET); e.remove(PREF_KEY_TWITTER_LOGIN); e.commit(); // After this take the appropriate action // I am showing the hiding/showing buttons again // You might not needed this code btnLogoutTwitter.setVisibility(View.GONE); btnUpdateStatus.setVisibility(View.GONE); txtUpdate.setVisibility(View.GONE); lblUpdate.setVisibility(View.GONE); lblUserName.setText(""); lblUserName.setVisibility(View.GONE); btnLoginTwitter.setVisibility(View.VISIBLE); } /** * 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(); } }

AlertDialogManager.java:

package com.androidhive.twitterconnect; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; public class AlertDialogManager { /** * Function to display simple Alert Dialog * @param context - application context * @param title - alert dialog title * @param message - alert message * @param status - success/failure (used to set icon) * - pass null if you don''t want icon * */ public void showAlertDialog(Context context, String title, String message, Boolean status) { AlertDialog alertDialog = new AlertDialog.Builder(context).create(); // Setting Dialog Title alertDialog.setTitle(title); // Setting Dialog Message alertDialog.setMessage(message); if(status != null) // Setting alert dialog icon alertDialog.setIcon((status) ? R.drawable.success : R.drawable.fail); // Setting OK Button alertDialog.setButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }); // Showing Alert Message alertDialog.show(); } }

ConnectionDetector.java:

package com.androidhive.twitterconnect; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; public class ConnectionDetector { private Context _context; public ConnectionDetector(Context context){ this._context = context; } /** * Checking for all possible internet providers * **/ public boolean isConnectingToInternet(){ ConnectivityManager connectivity = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivity != null) { NetworkInfo[] info = connectivity.getAllNetworkInfo(); if (info != null) for (int i = 0; i < info.length; i++) if (info[i].getState() == NetworkInfo.State.CONNECTED) { return true; } } return false; } }

Este es el código original de Ravi Tamada. Los cambios que hice están en los archivos MainActivity.java y AndroidManifest.xml solamente.

Quiero integrar twitter en una aplicación de Android y encontré muchos tutoriales. Implementé 2 de ellos. Pero después de la implementación, cuando ejecuté la aplicación, supe que usan una versión anterior de la biblioteca de twitter4J .

Aunque hay muchos otros tutoriales disponibles, ninguno de ellos es el último. Solo tienen 2-3 meses más. Necesito un tutorial o un ejemplo que utilice la última versión de la biblioteca de twitter4J , que es twitter4j-core-3.0.3 .

Mi objetivo principal es permitir al usuario publicar tweets en su cuenta. Pero nuevamente, si el usuario no está conectado, primero necesito pedir credenciales. Además, si el usuario hace clic en el botón de logout entonces necesito alguna manera de desconectar al usuario.



Para ilustrar mi comentario anterior, aquí está mi última clase de actividad de MainActivity. Muy similar al código anterior, las diferencias son:

  • la clase interna OAuthAccessTokenTask , que incluye la recuperación del token de Oauth y la información del usuario
  • su devolución de llamada onRequestTokenRetrieved(Exception)

Además, tenga en cuenta que para que esto funcione debe declarar una url de devolución de llamada en la configuración de su aplicación de Twitter, incluso una falsa. Me tomó algunas horas descubrir cómo funciona.

Cuando revisa la documentación de twitter4j, los primeros fragmentos de código se refieren a un código PIN que debe obtener de una página web de autorización. Eso es lo que sucede cuando no hay una url de devolución de llamada establecida en su aplicación. Se llama autenticación basada en PIN y no desea usarla en un dispositivo móvil :)

public class MainActivity extends Activity { // Constants /** * Register your here app https://dev.twitter.com/apps/new and get your * consumer key and secret * */ static String TWITTER_CONSUMER_KEY = "PutYourConsumerKeyHere"; // place your cosumer key here static String TWITTER_CONSUMER_SECRET = "PutYourConsumerSecretHere"; // place your consumer secret here // 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"; static final String TWITTER_CALLBACK_URL = "oauth://t4jsample"; // Twitter oauth urls static final String URL_TWITTER_AUTH = "auth_url"; static final String URL_TWITTER_OAUTH_VERIFIER = "oauth_verifier"; static final String URL_TWITTER_OAUTH_TOKEN = "oauth_token"; // Login button Button btnLoginTwitter; // Update status button Button btnUpdateStatus; // Logout button Button btnLogoutTwitter; // EditText for update EditText txtUpdate; // lbl update TextView lblUpdate; TextView lblUserName; // Progress dialog ProgressDialog pDialog; // Twitter private static Twitter twitter; private static RequestToken requestToken; private AccessToken accessToken; private User user; // Shared Preferences private static SharedPreferences mSharedPreferences; // Internet Connection detector private ConnectionDetector cd; // Alert Dialog Manager AlertDialogManager alert = new AlertDialogManager(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); cd = new ConnectionDetector(getApplicationContext()); // Check if Internet present if (!cd.isConnectingToInternet()) { // Internet Connection is not present alert.showAlertDialog(MainActivity.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(MainActivity.this, "Twitter oAuth tokens", "Please set your twitter oauth tokens first!", false); // stop executing code by return return; } // All UI elements btnLoginTwitter = (Button) findViewById(R.id.btnLoginTwitter); btnUpdateStatus = (Button) findViewById(R.id.btnUpdateStatus); btnLogoutTwitter = (Button) findViewById(R.id.btnLogoutTwitter); txtUpdate = (EditText) findViewById(R.id.txtUpdateStatus); lblUpdate = (TextView) findViewById(R.id.lblUpdate); lblUserName = (TextView) findViewById(R.id.lblUserName); // Shared Preferences mSharedPreferences = getApplicationContext().getSharedPreferences("MyPref", 0); /** * Twitter login button click event will call loginToTwitter() function * */ btnLoginTwitter.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // Call login twitter function loginToTwitter(); } }); /** * Button click event to Update Status, will call updateTwitterStatus() * function * */ btnUpdateStatus.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Call update status function // Get the status from EditText String status = txtUpdate.getText().toString(); // Check for blank text if (status.trim().length() > 0) { // update status new updateTwitterStatus().execute(status); } else { // EditText is empty Toast.makeText( getApplicationContext(), "Please enter status message", Toast.LENGTH_SHORT ).show(); } } }); /** * Button click event for logout from twitter * */ btnLogoutTwitter.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // Call logout twitter function logoutFromTwitter(); } }); /** 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); new OAuthAccessTokenTask().execute(verifier); } } } private class OAuthAccessTokenTask extends AsyncTask<String, Void, Exception> { @Override protected Exception doInBackground(String... params) { Exception toReturn = null; try { accessToken = twitter.getOAuthAccessToken(requestToken, params[0]); user = twitter.showUser(accessToken.getUserId()); } catch(TwitterException e) { Log.e(MainActivity.class.getName(), "TwitterError: " + e.getErrorMessage()); toReturn = e; } catch(Exception e) { Log.e(MainActivity.class.getName(), "Error: " + e.getMessage()); toReturn = e; } return toReturn; } @Override protected void onPostExecute(Exception exception) { onRequestTokenRetrieved(exception); } } private void onRequestTokenRetrieved(Exception result) { if (result != null) { Toast.makeText( this, result.getMessage(), Toast.LENGTH_LONG ).show(); } else { try { // Shared Preferences Editor editor = mSharedPreferences.edit(); // After getting access token, access token secret // store them in application preferences editor.putString(PREF_KEY_OAUTH_TOKEN, accessToken.getToken()); editor.putString(PREF_KEY_OAUTH_SECRET, accessToken.getTokenSecret()); // Store login status - true editor.putBoolean(PREF_KEY_TWITTER_LOGIN, true); editor.commit(); // save changes Log.e("Twitter OAuth Token", "> " + accessToken.getToken()); // Hide login button btnLoginTwitter.setVisibility(View.GONE); // Show Update Twitter lblUpdate.setVisibility(View.VISIBLE); txtUpdate.setVisibility(View.VISIBLE); btnUpdateStatus.setVisibility(View.VISIBLE); btnLogoutTwitter.setVisibility(View.VISIBLE); // Getting user details from twitter String username = user.getName(); // Displaying in xml ui lblUserName.setText(Html.fromHtml("<b>Welcome " + username + "</b>")); } catch (Exception ex) { // Check log for login errors Log.e("Twitter Login Error", "> " + ex.getMessage()); ex.printStackTrace(); } } } /** * 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(); Thread thread = new Thread(new Runnable(){ @Override public void run() { try { requestToken = twitter.getOAuthRequestToken(TWITTER_CALLBACK_URL); MainActivity.this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(requestToken.getAuthenticationURL()))); } catch (Exception e) { e.printStackTrace(); Toast.makeText(getApplicationContext(), "Already Logged into twitter", Toast.LENGTH_LONG).show(); } } }); thread.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(MainActivity.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()); e.printStackTrace(); } 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 txtUpdate.setText(""); } }); } } /** * Function to logout from twitter * It will just clear the application shared preferences * */ private void logoutFromTwitter() { // Clear the shared preferences Editor e = mSharedPreferences.edit(); e.remove(PREF_KEY_OAUTH_TOKEN); e.remove(PREF_KEY_OAUTH_SECRET); e.remove(PREF_KEY_TWITTER_LOGIN); e.commit(); // After this take the appropriate action // I am showing the hiding/showing buttons again // You might not needed this code btnLogoutTwitter.setVisibility(View.GONE); btnUpdateStatus.setVisibility(View.GONE); txtUpdate.setVisibility(View.GONE); lblUpdate.setVisibility(View.GONE); lblUserName.setText(""); lblUserName.setVisibility(View.GONE); btnLoginTwitter.setVisibility(View.VISIBLE); } /** * 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(); } }


Este es el ejemplo de trabajo de mi código, estoy usando twitter4j y tampoco es necesario establecer ningún intento en el manifiesto ya que uso webview en lugar de navegador.

Coloque su consumidor y la clave secreta y debe ser bueno para ir

package com.example.mysituationtwittertest; import twitter4j.Twitter; import twitter4j.TwitterException; import twitter4j.TwitterFactory; import twitter4j.auth.AccessToken; import twitter4j.auth.RequestToken; import twitter4j.conf.Configuration; import twitter4j.conf.ConfigurationBuilder; import android.app.Activity; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { // Constants /** * Register your here app https://dev.twitter.com/apps/new and get your * consumer key and secret * */ static String TWITTER_CONSUMER_KEY = "XXXXXXXXXXXXXXXXXXX"; // place your // cosumer // key here static String TWITTER_CONSUMER_SECRET = "XXXXXXXXXXXXXXXX"; // place // your // consumer // secret // here // 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"; static final String TWITTER_CALLBACK_URL = "oauth://youdare"; // Twitter oauth urls static final String URL_TWITTER_AUTH = "auth_url"; static final String URL_TWITTER_OAUTH_VERIFIER = "oauth_verifier"; static final String URL_TWITTER_OAUTH_TOKEN = "oauth_token"; // Login button Button btnShareTwitter; WebView myWebView; // Twitter private static Twitter twitter; private static RequestToken requestToken; private AccessToken accessToken; // Shared Preferences private static SharedPreferences mSharedPreferences; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // All UI elements btnShareTwitter = (Button) findViewById(R.id.btnShareTwitter); myWebView = (WebView) findViewById(R.id.webView1); myWebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView webView, String url) { if (url != null && url.startsWith(TWITTER_CALLBACK_URL)) new AfterLoginTask().execute(url); else webView.loadUrl(url); return true; } }); // Shared Preferences mSharedPreferences = getApplicationContext().getSharedPreferences( "MyPref", 0); /** * Twitter login button click event will call loginToTwitter() function * */ btnShareTwitter.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // Call login twitter function new LoginTask().execute(); } }); } /** * 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(); try { requestToken = twitter .getOAuthRequestToken(TWITTER_CALLBACK_URL); } catch (TwitterException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { // user already logged into twitter Toast.makeText(getApplicationContext(), "Already Logged into twitter", Toast.LENGTH_LONG).show(); } } /** * 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); } public void handleTwitterCallback(String url) { Uri uri = Uri.parse(url); // oAuth verifier final String verifier = uri .getQueryParameter(URL_TWITTER_OAUTH_VERIFIER); try { // Get the access token MainActivity.this.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()); 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("XXXXXXXXXXXXXXXXX"); } catch (Exception e) { e.printStackTrace(); } } class LoginTask extends AsyncTask<Void, Void, Boolean> { @Override protected Boolean doInBackground(Void... params) { // TODO Auto-generated method stub loginToTwitter(); return true; } @Override protected void onPostExecute(Boolean result) { // TODO Auto-generated method stub myWebView.loadUrl(requestToken.getAuthenticationURL()); myWebView.setVisibility(View.VISIBLE); myWebView.requestFocus(View.FOCUS_DOWN); } } class AfterLoginTask extends AsyncTask<String, Void, Boolean> { @Override protected void onPreExecute() { // TODO Auto-generated method stub myWebView.clearHistory(); } @Override protected Boolean doInBackground(String... params) { // TODO Auto-generated method stub handleTwitterCallback(params[0]); return true; } @Override protected void onPostExecute(Boolean result) { // TODO Auto-generated method stub myWebView.setVisibility(View.GONE); Toast.makeText(MainActivity.this, "Tweet Successful", Toast.LENGTH_SHORT).show(); } } @Override public void onBackPressed() { if (myWebView.getVisibility() == View.VISIBLE) { if (myWebView.canGoBack()) { myWebView.goBack(); return; } else { myWebView.setVisibility(View.GONE); return; } } super.onBackPressed(); } }


¿Has visto el proyecto github de inicio de sesión con twitter , está basado en twitter4j e implementa el inicio de sesión de Twitter para Android?