Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / Mobile / Android

Twitter Integration in Android and Its New API v1.1

0.00/5 (No votes)
5 Dec 2014CPOL2 min read 7.9K  
Twitter Integration in Android and Its New API v1.1

Twitter API v1 Retirement and Use Case of Use API v1.1

The Twitter REST API v1 will officially retire on June 11, 2013. So it is time now to migrate all your applications from API v1 to API v1.1.

If you are using Twitter4J jar file in your application, then simply update your application with this jar file “ twitter4j-core-3.0.3” in your libs folder of application. There is some change in the method also in this file. Here, I am showing the list of that method changed in this new jar file.

Retired method migrate to
disableNotification() updateFriendship()
enableNotification() updateFriendship()
getProfileImage() User#getBigger|Mini|OriginalProfileImageURL()
getBlockingUsersIDs() getBlocksIDs()
getLocationTrends() getPlaceTrends()
getAllUserLists() getUserLists()
getAvailableTrends(GeoLocation) getClosestTrends(GeoLocation)
getFavorites(int) getFavorites(Paging paging)
getBlockingUsers() getBlocksList(cursor)
getPublicTimeline() N/A
AccountTotals getAccountTotals() N/A
IDs getNoRetweetIds() N/A
IDs getRetweetedByIDs(long) N/A
IDs getRetweetedByIDs(long, Paging) N/A
getRetweetedByMe() N/A
getRetweetedByUser() N/A
getRetweetedToMe() N/A
getRetweetedToUser() N/A
getRetweetsOfMe() N/A
getDailyTrends() N/A
getWeeklyTrends() N/A
getRetweetedBy() N/A
boolean existsBlock() N/A
boolean existsFriendship() N/A
boolean test() N/A

Updating Twitter4j jar File in Android Application

Step 1

Open your existing project, right click on Project folder >> property>>Java Build Path>>library>> select previous Twitter4j-core file >> click on remove

Now copy and paste Twitter4j-core-3.0.3 jar file in your existing project libs folder and do the following. Right click on Project >> properties>>java Build Path>>library>> add Jar >> choose your project libs folder >.select the Twitter4j-core-3.0.3 file and >> apply.

Step 2

After performing step one, go into your src folder source code and modify the required method if needed as per the above given table. This is the basic way to update your existing twitter integration in Android.

Now I am going to show a simple integration of Twitter in Android Step 1

You need to create the following classes and XML file for this integration:

  1. TwitterHomeActivity (main class)
  2. ConnectionDetector (for checking Internet connection)
  3. AlertDialogManager (for Alert Message)
  4. activity_twitter_home.xml (mail activity class XML)

Image 1   Image 2

Step 3

Use the following code for this integration:

Java
public class AlertDialogManager {

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();
}}
Java
public class ConnectionDetector {

private Context _context;

public ConnectionDetector(Context context){
    this._context = context;
}
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)
                  {
                      Log.d("Network", "NETWORKnAME: "+info[i].getTypeName());
                      return true;
                  }
      }
      return false;
}}

Android Manifest file looks like this:

XML
<?xml version="1.0" encoding="utf-8"?>

<uses-sdk
    android:minSdkVersion="6"
    android:targetSdkVersion="8" />
<!-- 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="com.sks.twitter.TwitterHomeActivity"
        android:label="@string/app_name" >
        <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>

Activity_twitter_home.xml looks like this:

XML
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".TwitterHomeActivity" >

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginLeft="106dp"
    android:layout_marginTop="21dp"
    android:text="@string/hello_world"
    android:textColor="#A52A2A"
    android:textStyle="bold"
    android:typeface="serif" />

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/textView1"
    android:layout_below="@+id/textView1"
    android:layout_marginTop="80dp"
    android:text="Login to twitter" />

<EditText
    android:id="@+id/editText1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:visibility="gone"
    android:ems="10" />

<Button
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/editText1"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="34dp"
    android:visibility="gone"
    android:text="Tweets" />

Finally, TwitterHomeActivity code is as given below:

C#
public class TwitterHomeActivity extends Activity {
    static String TWITTER_CONSUMER_KEY = "marlVCZaLYAG52rVvholRw"; 
static String TWITTER_CONSUMER_SECRET = "5uZZFboHSK9psBPsqJUDSb1GuC36Fy83cYornOPu9A"; 
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";
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";

ProgressDialog pDialog;
private static Twitter twitter;
private static RequestToken requestToken;
private static SharedPreferences mSharedPreferences;
private ConnectionDetector cd;
AlertDialogManager alert = new AlertDialogManager();
EditText sts;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_twitter_home);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


    cd = new ConnectionDetector(getApplicationContext());
    if (!cd.isConnectingToInternet()) {
        alert.showAlertDialog(TwitterHomeActivity.this, "Internet Connection Error",
                "Please connect to working Internet connection", false);
        return;
    }
    // Check if twitter keys are set
    if(TWITTER_CONSUMER_KEY.trim().length() == 0 || TWITTER_CONSUMER_SECRET.trim().length() == 0){
        alert.showAlertDialog(TwitterHomeActivity.this, "Twitter oAuth tokens", 
			"Please set your twitter oauth tokens first!", false);
        return;
    }
    mSharedPreferences = getApplicationContext().getSharedPreferences("MyPref", 0);

    findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            loginToTwitter();
        }
    });
    findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            sts = (EditText)findViewById(R.id.editText1);
            String status = sts.getText().toString();
            if (status.trim().length() > 0) {
                new updateTwitterStatus().execute(status);
            } else {
                Toast.makeText(getApplicationContext(),
                        "Please enter status message", Toast.LENGTH_SHORT).show();
            }
        }
    });

    if (!isTwitterLoggedInAlready()) {
        Uri uri = getIntent().getData();
        if (uri != null && uri.toString().startsWith(TWITTER_CALLBACK_URL)) {
            String verifier = uri.getQueryParameter(URL_TWITTER_OAUTH_VERIFIER);
            try {
                AccessToken accessToken = twitter.getOAuthAccessToken(requestToken, verifier);
                // Shared Preferences
                Editor e = mSharedPreferences.edit();
                e.putString(PREF_KEY_OAUTH_TOKEN, accessToken.getToken());
                e.putString(PREF_KEY_OAUTH_SECRET,accessToken.getTokenSecret());
                e.putBoolean(PREF_KEY_TWITTER_LOGIN, true);
                e.commit();

                Log.e("Twitter OAuth Token", "> " + accessToken.getToken());

                findViewById(R.id.button1).setVisibility(View.GONE);
                findViewById(R.id.editText1).setVisibility(View.VISIBLE);
                findViewById(R.id.button2).setVisibility(View.VISIBLE);

                long userID = accessToken.getUserId();
                User user = twitter.showUser(userID);
                String username = user.getName();
                Log.e("UserID: ", "userID: "+userID+""+username);
                Log.v("Welcome:","Thanks:"+Html.fromHtml("<b>Welcome " + username + "</b>"));
            } catch (Exception e) {
                Log.e("Twitter Login Error", "> " + e.getMessage());
            }
        }
    }
}

private void loginToTwitter() {
    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);
            this.startActivity(new Intent(Intent.ACTION_VIEW, 
                    Uri.parse(requestToken.getAuthenticationURL())));
        } catch (TwitterException e) {
            e.printStackTrace();
        }
    } else {
        Toast.makeText(getApplicationContext(),
                "Already Logged into twitter", Toast.LENGTH_LONG).show();
    }
}
private boolean isTwitterLoggedInAlready() {
    return mSharedPreferences.getBoolean(PREF_KEY_TWITTER_LOGIN, false);
}
class updateTwitterStatus extends AsyncTask<String, String, String> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(TwitterHomeActivity.this);
        pDialog.setMessage("Updating to twitter...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }
    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;
    }
    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
                sts.setText("");
            }
        });
    }
}}

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)