Wednesday, 22 June 2016

Twitter Share in Android

If you want to share any post in twitter along with image in android Please follow the below steps

Before that you have to create an application in twitter developer console.

https://dev.twitter.com/apps



Then you will get 'Consumer Key' and 'Consumer Secret' from 'Keys and Access Tokens' tab.



now start the android coding.

If you are using Android Studio
dependencies {
compile 'org.twitter4j:twitter4j-core:4.0.3'
}
If you are using Eclipse then you have to download "twitter4j-core-4.0.1.jar" file from the below link


http://twitter4j.org/maven2/org/twitter4j/twitter4j-core/4.0.1/

Add these permission in Manifest file.
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

Now Here is the final MainActivity.java file

package com.syntax.twittershare;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.StrictMode;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.InputStream;

import twitter4j.StatusUpdate;
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;

public class MainActivity extends AppCompatActivity {
    Button button_Twitter;
    //Twitter Share ----- START
    private static SharedPreferences sharedPreferences;
    private static final String PREF_NAME = "sample_twitter_pref";
    private static final String PREF_KEY_OAUTH_TOKEN = "oauth_token";
    private static final String PREF_KEY_OAUTH_SECRET = "oauth_token_secret";
    private static final String PREF_KEY_TWITTER_LOGIN = "is_twitter_loggedin";
    private static final String PREF_USER_NAME = "twitter_user_name";

    private String consumerKey = null;
    private String consumerSecret = null;
    private String callbackUrl = null;
    private String oAuthVerifier = null;

    private static Twitter twitter;
    private static RequestToken requestToken;
    AccessToken accessToken;
    String verifier = null;
    String toastMessage = "";
    private static String TAG = "twitter_share";
    Toast toast;
    private static Activity activity;
    //Twitter Share ----- END
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        activity = this;
        //Twitter Share ----- START
        sharedPreferences = getSharedPreferences(PREF_NAME, 0);
        consumerKey = getString(R.string.twitter_consumer_key);
        consumerSecret = getString(R.string.twitter_consumer_secret);
        callbackUrl = getString(R.string.twitter_callback);
        oAuthVerifier = getString(R.string.twitter_oauth_verifier);

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        boolean isLoggedIn = sharedPreferences.getBoolean(PREF_KEY_TWITTER_LOGIN, false);
        if(isLoggedIn) {
            Toast.makeText(MainActivity.this, "user already loggedin", Toast.LENGTH_SHORT).show();
        } else {

            Uri uri = getIntent().getData();

            if(uri != null && uri.toString().startsWith(callbackUrl)) {

                String verifier = uri.getQueryParameter(oAuthVerifier);

                try {

                    AccessToken accessToken = twitter.getOAuthAccessToken(requestToken, verifier);
                    long userId = accessToken.getUserId();
                    final User user = twitter.showUser(userId);
                    final String username = user.getName();

                    saveTwitterInfo(accessToken);

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        //Twitter Share ----- END
        button_Twitter = (Button) findViewById(R.id.button_Twitter);
        button_Twitter.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (isNetworkAvailable()){
                    loginToTwitter();
                }else {
                    toastMessage = "Internet not available, Please try again later";
                    try{
                        toast.getView().isShown();     // true if visible
                        toast.setText(toastMessage);
                    } catch (Exception e) {         // invisible if exception
                        toast = Toast.makeText(MainActivity.this, toastMessage, Toast.LENGTH_SHORT);
                    }
                    toast.show();
//                    inTwitterShareFailed();
                }
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //Twitter Share ----- START
        if(resultCode == Activity.RESULT_OK && requestCode == 100) {
            Log.e(TAG,"Start Twitter Share");
            verifier = data.getExtras().getString(oAuthVerifier);

            try {
                accessToken = twitter.getOAuthAccessToken(requestToken, verifier);

                long userId = accessToken.getUserId();
                final User user = twitter.showUser(userId);
                String username = user.getName();

                saveTwitterInfo(accessToken);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }else {
            Log.e(TAG,"Twitter Share Failed");
//            inTwitterShareFailed();
        }
        //Twitter Share ----- END
    }

    //Twitter Share ----- START
    private void loginToTwitter() {
        Log.e(TAG, "loginToTwitter() called with: " + "");
        boolean isLoggedIn = sharedPreferences.getBoolean(PREF_KEY_TWITTER_LOGIN, false);

        if(!isLoggedIn) {
            final ConfigurationBuilder builder = new ConfigurationBuilder();
            builder.setOAuthConsumerKey(consumerKey);
            builder.setOAuthConsumerSecret(consumerSecret);

            final Configuration configuration = builder.build();
            final TwitterFactory factory = new TwitterFactory(configuration);
            twitter = factory.getInstance();

            try {
                requestToken = twitter.getOAuthRequestToken(callbackUrl);

                final Intent intent = new Intent(this, WebViewActivity.class);
                intent.putExtra(WebViewActivity.EXTRA_URL, requestToken.getAuthenticationURL());
                startActivityForResult(intent, 100);
            } catch (TwitterException e) {
                e.printStackTrace();
            }
        } else {
            Toast.makeText(MainActivity.this, "You already logged in", Toast.LENGTH_SHORT).show();
            twitterShare();
        }
    }

    public void twitterShare(){
        new updateTwitterStatus().execute("Share text");
    }

    private void saveTwitterInfo(AccessToken accessToken) {

        long userId = accessToken.getUserId();

        User user;

        try {

            user = twitter.showUser(userId);
            String username = user.getName();

            SharedPreferences.Editor e = sharedPreferences.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.putString(PREF_USER_NAME, username);
            e.commit();

        } catch (TwitterException e) {
            e.printStackTrace();
        }
    }

    class updateTwitterStatus extends AsyncTask {
        private ProgressDialog pDialog;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Posting to Twitter...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        @Override
        protected Void doInBackground(String... params) {

            String status = params[0];

            try {
                ConfigurationBuilder builder = new ConfigurationBuilder();
                builder.setOAuthConsumerKey(consumerKey);
                builder.setOAuthConsumerSecret(consumerSecret);

                String access_token = sharedPreferences.getString(PREF_KEY_OAUTH_TOKEN, "");
                String acces_token_secret = sharedPreferences.getString(PREF_KEY_OAUTH_SECRET, "");

                AccessToken accessToken = new AccessToken(access_token, acces_token_secret);

                Twitter twitter = new TwitterFactory(builder.build()).getInstance(accessToken);

                StatusUpdate statusUpdate = new StatusUpdate(status);
                InputStream is = getResources().openRawResource(+R.drawable.shareimage);
                statusUpdate.setMedia("shareimage.png", is);

                twitter4j.Status response = twitter.updateStatus(statusUpdate);

            } catch (TwitterException e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {

            pDialog.dismiss();
            Log.e(TAG,"Twitter Share Succeed");
            Toast.makeText(MainActivity.this, "Posted to Twitter!", Toast.LENGTH_SHORT);
//            inTwitterShareSuccessed();

        }
    }
    //Twitter Share ----- END
    //Network Checking
    public static boolean  isNetworkAvailable() {
        ConnectivityManager connectivityManager  = (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null;
    }
}


AndroidManifest.xml file
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.syntax.twittershare">
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".WebViewActivity"
            android:label="@string/app_name" />
    </application>

</manifest>

activity_webview.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/urlContainer"
android:orientation="horizontal">


<WebView
android:id="@+id/weView"
android:layout_width="match_parent"
android:layout_height="match_parent">


</WebView>
</LinearLayout>


WebViewActivity.java
package com.syntax.twittershare;

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 WebViewActivity extends Activity {

private WebView webView;

public static String EXTRA_URL = "extra_url";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_webview);

final String url = this.getIntent().getStringExtra(EXTRA_URL);

if(url == null) {
finish();
}

webView = (WebView) findViewById(R.id.weView);
webView.setWebViewClient(new MyWebViewClient());
webView.loadUrl(url);
}

class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {

if(url.contains(getResources().getString(R.string.twitter_callback))) {

Uri uri = Uri.parse(url);

String verifier = uri.getQueryParameter(getString(R.string.twitter_oauth_verifier));
Intent resultIntent = new Intent();
resultIntent.putExtra(getString(R.string.twitter_oauth_verifier), verifier);
setResult(RESULT_OK, resultIntent);

finish();
return true;
}
return false;
}
}
}


Here is the DOWNLOAD link for the project.

No comments:

Post a Comment