Basic Code for Twitter oAuth for Android works with any version of Android I have tested it against – will crash if no Internet access but adding a check for this is relevantly simple (wanted to keep the code just about the oAuth process – the core idea and code comes from this blogpost
AndroidBasicOAuthActivity Code
package me.crowleydavid.android.basicoauth; 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.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; import android.preference.PreferenceManager; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class AndroidBasicOAuthActivity extends Activity { private int TWITTER_AUTH; private Twitter mTwitter; private RequestToken mRequestToken; private String accessToken; private String accessTokenSecret; private boolean haveConnectedWifi; private boolean haveConnectedMobile; private double x; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); accessToken = settings.getString( "twitter_access_token", null ); accessTokenSecret = settings.getString( "twitter_access_token_secret", null ); Button tweetB = (Button) findViewById(R.id.tweet_button); tweetB.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub updateStatus(); } }); } private boolean haveNetworkConnection() { haveConnectedWifi = false; haveConnectedMobile = false; ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo[] netInfo = cm.getAllNetworkInfo(); for (NetworkInfo ni : netInfo) { if (ni.getTypeName().equalsIgnoreCase("WIFI")) if (ni.isConnected()) haveConnectedWifi = true; if (ni.getTypeName().equalsIgnoreCase("MOBILE")) if (ni.isConnected()) haveConnectedMobile = true; } return haveConnectedWifi || haveConnectedMobile; } // private void updateStatusLoggedIn() { // SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); // accessToken = settings.getString( "twitter_access_token", null ); // accessTokenSecret = settings.getString( "twitter_access_token_secret", null ); // // // String s2 = String.valueOf(i); // // Toast.makeText(this, s2, 10000).show(); // ConfigurationBuilder builder = new ConfigurationBuilder(); // builder.setOAuthConsumerKey(Constants.CONSUMER_KEY); // builder.setOAuthConsumerSecret(Constants.CONSUMER_SECRET); // builder.setOAuthAccessToken(accessToken); // builder.setOAuthAccessTokenSecret(accessTokenSecret); // Configuration conf = builder.build(); // Twitter t = new TwitterFactory(conf).getInstance(); // i++; // try { // if(i<10){ // t.updateStatus( "Loggedin" + i); // } // } // catch (TwitterException e) { // e.printStackTrace(); // } // // } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub if (requestCode == TWITTER_AUTH) { if (resultCode == Activity.RESULT_OK) { Toast.makeText(this, "Hey Ho", 300).show(); String oauthVerifier = (String) data.getExtras().get("oauth_verifier"); AccessToken at = null; try { // Pair up our request with the response at = mTwitter.getOAuthAccessToken(oauthVerifier); String theToken = at.getToken(); // Toast.makeText(this, theToken, 10000).show(); String theTokenSecret = at.getTokenSecret(); // Toast.makeText(this, theTokenSecret, 10000).show(); SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); settings = PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences.Editor editor = settings.edit(); editor.putString("twitter_access_token",theToken); editor.putString("twitter_access_token_secret", theTokenSecret); editor.commit(); // his method // settings.edit() // .putString( "twitter_access_token", at.getToken() ) // .putString( "twitter_access_token_secret", at.getTokenSecret() ) // .commit(); // Intent i = new Intent(this, someclass.class); // startActivity(i); updateStatus(); } catch (TwitterException e) { e.printStackTrace(); } } } else { Toast.makeText(this, "uh oh, Spaghetti Os", 300).show(); } } private void updateStatus() { // TODO Auto-generated method stub SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); accessToken = settings.getString( "twitter_access_token", null ); accessTokenSecret = settings.getString( "twitter_access_token_secret", null ); // Toast.makeText(this, accessToken, 10000).show(); // Toast.makeText(this, accessTokenSecret, 10000).show(); haveNetworkConnection(); if ((haveConnectedWifi)|| (haveConnectedMobile)){ ConfigurationBuilder builder = new ConfigurationBuilder(); builder.setOAuthConsumerKey(Constants.CONSUMER_KEY); builder.setOAuthConsumerSecret(Constants.CONSUMER_SECRET); builder.setOAuthAccessToken(accessToken); builder.setOAuthAccessTokenSecret(accessTokenSecret); Configuration conf = builder.build(); Twitter t = new TwitterFactory(conf).getInstance(); try { x = Math.random(); t.updateStatus( "Yo ho ho and a bottle of rum " + x); } catch (TwitterException e) { e.printStackTrace(); } } else{ Toast.makeText(this, "No access to Internet..please try again", 3000).show(); } } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); accessToken = settings.getString( "twitter_access_token", null ); accessTokenSecret = settings.getString( "twitter_access_token_secret", null ); haveNetworkConnection(); if ((haveConnectedWifi)|| (haveConnectedMobile)){ // Toast.makeText(this, "Internet is go!", 3000).show(); // Intent i = new Intent(this, AndroidBasicOAuthActivity.class); // startActivity(i); if ((accessToken==null)||(accessTokenSecret==null)){ mTwitter = new TwitterFactory().getInstance(); mRequestToken = null; mTwitter.setOAuthConsumer(Constants.CONSUMER_KEY,Constants.CONSUMER_SECRET ); String callbackURL = getResources().getString(R.string.twitter_callback); try { mRequestToken = mTwitter.getOAuthRequestToken(callbackURL); } catch (TwitterException e) { e.printStackTrace(); } Intent i = new Intent(this, TwitterWebviewActivity.class); i.putExtra("URL", mRequestToken.getAuthenticationURL()); startActivityForResult(i, TWITTER_AUTH); } else{ Toast.makeText(this, "Token found..logged in", 3000).show(); // updateStatusLoggedIn(); } } else{ Toast.makeText(this, "No access to Internet..please try again", 3000).show(); Intent i = new Intent(this, CheckNetAccess.class); startActivity(i); } } }
Constants Code you need to enter your own Twitter Developer keys here
package me.crowleydavid.android.basicoauth; public class Constants { public static final String CONSUMER_KEY = "************"; public static final String CONSUMER_SECRET= "**************";
TwitterWebviewActivity Code
package me.crowleydavid.android.basicoauth; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.webkit.WebView; import android.webkit.WebViewClient; public class TwitterWebviewActivity extends Activity { private Intent mIntent; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.twitter_webview); mIntent = getIntent(); String url = (String)mIntent.getExtras().get("URL"); WebView webView = (WebView) findViewById(R.id.webview); webView.setWebViewClient( new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if( url.contains(getResources().getString( R.string.twitter_callback ))) { Uri uri = Uri.parse( url ); String oauthVerifier = uri.getQueryParameter( "oauth_verifier" ); mIntent.putExtra( "oauth_verifier", oauthVerifier ); setResult( RESULT_OK, mIntent ); finish(); return true; } return false; } }); webView.loadUrl(url); } }
}
CheckNetAccess Code
package me.crowleydavid.android.basicoauth; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class CheckNetAccess extends Activity { private boolean haveConnectedWifi; private boolean haveConnectedMobile; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.checknet); Button netB = (Button) findViewById(R.id.netbutton); netB.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub haveNetworkConnection(); if ((haveConnectedWifi)|| (haveConnectedMobile)){ Toast.makeText(CheckNetAccess.this, "Internet is go!", 3000).show(); Intent i = new Intent(CheckNetAccess.this, AndroidBasicOAuthActivity.class); startActivity(i); } else{ Toast.makeText(CheckNetAccess.this, "No access to Internet..please try again", 3000).show(); } } }); } private boolean haveNetworkConnection() { haveConnectedWifi = false; haveConnectedMobile = false; ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo[] netInfo = cm.getAllNetworkInfo(); for (NetworkInfo ni : netInfo) { if (ni.getTypeName().equalsIgnoreCase("WIFI")) if (ni.isConnected()) haveConnectedWifi = true; if (ni.getTypeName().equalsIgnoreCase("MOBILE")) if (ni.isConnected()) haveConnectedMobile = true; } return haveConnectedWifi || haveConnectedMobile; } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); } }
Android Manifest needs these permissions
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" />