Saturday, 21 December 2013

Twitter Integration in Android

Steps for Twitter Integration
------------------------------

1. You have to create an Account on Twitter before you do anything.
2. Register you application with Twitter here (https://dev.twitter.com/user)
3. Create new application in twitter
  Name:your project name
  Description:
  website:"enter website"
  Callack url="enter url"


  then, goes to twitter settings in that application type select Access permission and check the Sign in with twitter button copy the consumer key and secret key

 4. open eclipse and create new project
5. write below permissions in manifest file
  <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

 then Download below Library files and add to your project 

 signpost-commonshttp4-1.2.1.1.jar
signpost-core-1.2.1.1.jar


http://code.google.com/p/oauth-signpost/

httpclient-4.0.1.jar
http://hc.apache.org/httpcomponents-client-ga/

twitter4j-core-2.1.11
http://twitter4j.org/en/index.html
 
  MainActivity
---------------
 public class MainActivity extends Activity {
    Button buttonLogin;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (!OSUtil.IsNetworkAvailable(getApplicationContext())) {
            AlertMessageBox.Show(MainActivity.this, "Internet connection", "A valid internet connection can't be established", AlertMessageBox.AlertMessageBoxIcon.Info);
            return;
        }
              initializeComponent();
    }
    private void initializeComponent() {
        buttonLogin = (Button) findViewById(R.id.buttonLogin);
        buttonLogin.setOnClickListener(buttonLoginOnClickListener);

         }
    private View.OnClickListener buttonLoginOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
 Twitt_Sharing twitt = new Twitt_Sharing(NewsDetails.this,"consumer_key", "secret_key");
       
  twitt.shareToTwitter(your message);
        
        }
    };

    }
 

  TwitterSharing
----------------

public class Twitt_Sharing
{
    InputStream in;
    private final Twitter_Handler mTwitter;
    private final Activity activity;
    private String twitt_msg;
    private String image_path;
    public Twitt_Sharing(Activity act, String consumer_key,String consumer_secret)
    {
        this.activity = act;
        mTwitter = new Twitter_Handler(activity, consumer_key, consumer_secret);
    }
    public void shareToTwitter(String msg)
    {
        this.twitt_msg = msg;
        mTwitter.setListener(mTwLoginDialogListener);

    if (mTwitter.hasAccessToken())
    {
        // this will post data in asyn background thread
       showTwittDialog();
    } else {
        mTwitter.authorize();
            }
    }
    private void showTwittDialog()
    {
        new PostTwittTask().execute(twitt_msg);
    }
    private final TwDialogListener mTwLoginDialogListener = new TwDialogListener()
    {
        @Override
        public void onError(String value)
        {
            showToast("Login Failed");
            mTwitter.resetAccessToken();
        }
        @Override
        public void onComplete(String value)
        {
            showTwittDialog();
        }
    };
    void showToast(final String msg)
    {
        activity.runOnUiThread(new Runnable()
        {
        @Override
        public void run() {
        Toast.makeText(activity, msg, Toast.LENGTH_SHORT).show();
        }
    });
    }
     class PostTwittTask extends AsyncTask<String, Void, String> {
    ProgressDialog pDialog;

    @Override
    protected void onPreExecute()
    {
        Log.v("in preexecute method","OnPreexecute method in twitter_sharing file");
        pDialog = new ProgressDialog(activity);
        pDialog.setMessage("Posting Twitt...");
        pDialog.setCancelable(false);
        pDialog.show();
                super.onPreExecute();
    }
    @Override
    protected String doInBackground(String... twitt)
    {
        try
        {
                 activity.runOnUiThread(new Runnable()
            {
                                @Override
                public void run()
                {
                                        try {
                        Share_Pic_Text_Titter(twitt_msg,mTwitter.twitterObj);
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            });
                return "success";
        }
        catch (Exception e)
        {
            if (e.getMessage().toString().contains("duplicate"))
            {
                return "Posting Failed because of Duplicate message...";
            }
            e.printStackTrace();
            return "Posting Failed!!!";
        }
    }
    @Override
    protected void onPostExecute(String result) {
        pDialog.dismiss();
        if (null != result && result.equals("success"))
        {
            showToast("Posted Successfully");
                    }
        else
        {
            showToast(result);
        }
        super.onPostExecute(result);
    }
    }

    public void Share_Pic_Text_Titter(String message,Twitter twitter) throws Exception
    {
    try
    {
        StatusUpdate st = new StatusUpdate(message);

// if you want to post image also then use st.setMedia(image_path);
                twitter.updateStatus(st);
          }
    catch (TwitterException e)
    {
        Log.d("TAG", "Pic Upload error" + e.getErrorMessage());
        Toast.makeText(activity,
            "Ooopss..!!! Failed to update on Twitter.",
            Toast.LENGTH_SHORT).show();
        throw e;
    }
    }
    public void Authorize_UserDetail() {
    }
    class async extends AsyncTask<Void,Void,Void>
    {
        ProgressDialog pDialog;
        @Override
        protected void onPreExecute()
        {
            pDialog = new ProgressDialog(activity);
            pDialog.setMessage("Posting Twitt...");
            pDialog.setCancelable(false);
            pDialog.show();
                        super.onPreExecute();
        }
       @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub
            mTwitter.setListener(mTwLoginDialogListener);
            return null;
        }
        @Override
        protected void onPostExecute(Void result)
        {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            pDialog.dismiss();
        }
      
    }
}


 Twitter_Handler
------------------
 public class Twitter_Handler {
    public static Twitter twitterObj;
    private final TwitterSession mSession;
    private AccessToken mAccessToken;
    private final CommonsHttpOAuthConsumer mHttpOauthConsumer;
    private final OAuthProvider mHttpOauthprovider;
    private final String mConsumerKey;
    private final String mSecretKey;
    private final ProgressDialog mProgressDlg;
    private TwDialogListener mListener;
    private final Activity context;

    public static final String CALLBACK_URL = "twitterapp://connect";
    private static final String TWITTER_ACCESS_TOKEN_URL = "https://api.twitter.com/oauth/access_token";
    private static final String TWITTER_AUTHORZE_URL = "https://api.twitter.com/oauth/authorize";
    private static final String TWITTER_REQUEST_URL = "https://api.twitter.com/oauth/request_token";

    public Twitter_Handler(Activity context, String consumerKey,
        String secretKey) {
    this.context = context;
    twitterObj = new TwitterFactory().getInstance();
    mSession = new TwitterSession(context);
    mProgressDlg = new ProgressDialog(context);
    mProgressDlg.requestWindowFeature(Window.FEATURE_NO_TITLE);
    mConsumerKey = consumerKey;
    mSecretKey = secretKey;
    mHttpOauthConsumer = new CommonsHttpOAuthConsumer(mConsumerKey,
        mSecretKey);
    String request_url = TWITTER_REQUEST_URL;
    String access_token_url = TWITTER_ACCESS_TOKEN_URL;
    String authorize_url = TWITTER_AUTHORZE_URL;
    mHttpOauthprovider = new DefaultOAuthProvider(request_url,
        access_token_url, authorize_url);
    mAccessToken = mSession.getAccessToken();
    configureToken();
    }
    public void setListener(TwDialogListener listener) {
    mListener = listener;
    }
    private void configureToken() {
    if (mAccessToken != null) {
        twitterObj.setOAuthConsumer(mConsumerKey, mSecretKey);
        twitterObj.setOAuthAccessToken(mAccessToken);
    }
    }
    public boolean hasAccessToken() {
    return (mAccessToken == null) ? false : true;
    }
    public void resetAccessToken() {
    if (mAccessToken != null) {
        mSession.resetAccessToken();
        mAccessToken = null;
    }
    }
    public String getUsername() {
    return mSession.getUsername();
    }
    public void updateStatus(String status) throws Exception {
    try {
        twitterObj.updateStatus(status);
    } catch (TwitterException e) {
        throw e;
    }
    }
    public void authorize() {
    mProgressDlg.setMessage("Loading ...");
    mProgressDlg.show();
    new Thread() {
        @Override
        public void run() {
        String authUrl = "";
        int what = 1;
        try {
            authUrl = mHttpOauthprovider.retrieveRequestToken(
                mHttpOauthConsumer, CALLBACK_URL);
            what = 0;
        } catch (Exception e) {
            e.printStackTrace();
        }
        mHandler.sendMessage(mHandler
            .obtainMessage(what, 1, 0, authUrl));
        }
    }.start();
    }
    public void processToken(String callbackUrl) {
    mProgressDlg.setMessage("Finalizing ...");
    mProgressDlg.show();
    final String verifier = getVerifier(callbackUrl);
    new Thread() {
        @Override
        public void run() {
        int what = 1;
        try {
            mHttpOauthprovider.retrieveAccessToken(mHttpOauthConsumer,
                verifier);
            mAccessToken = new AccessToken(
                mHttpOauthConsumer.getToken(),
                mHttpOauthConsumer.getTokenSecret());
            configureToken();
            User user = twitterObj.verifyCredentials();
            mSession.storeAccessToken(mAccessToken, user.getName());
            what = 0;
        } catch (Exception e) {
            e.printStackTrace();
        }
        mHandler.sendMessage(mHandler.obtainMessage(what, 2, 0));
        }
    }.start();
    }
    private String getVerifier(String callbackUrl) {
    String verifier = "";
    try {
        callbackUrl = callbackUrl.replace("twitterapp", "http");
        URL url = new URL(callbackUrl);
        String query = url.getQuery();
        String array[] = query.split("&");
        for (String parameter : array) {
        String v[] = parameter.split("=");
        if (URLDecoder.decode(v[0]).equals(
            oauth.signpost.OAuth.OAUTH_VERIFIER)) {
            verifier = URLDecoder.decode(v[1]);
            break;
        }
        }
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
    return verifier;
    }
    private void showLoginDialog(String url) {
    final TwDialogListener listener = new TwDialogListener() {
        @Override
        public void onComplete(String value) {
        processToken(value);
        }
        @Override
        public void onError(String value) {
        mListener.onError("Failed opening authorization page");
        }
    };
    new TwitterDialog(context, url, listener).show();
    }
    @SuppressLint("HandlerLeak")
    private final Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        mProgressDlg.dismiss();
        if (msg.what == 1) {
        if (msg.arg1 == 1)
            mListener.onError("Error getting request token");
        else
            mListener.onError("Error getting access token");
        } else {
        if (msg.arg1 == 1)
            showLoginDialog((String) msg.obj);
        else
            mListener.onComplete("");
        }
    }
    };
    public interface TwDialogListener {
    public void onComplete(String value);
    public void onError(String value);
    }
}

TwitterDialog
------------------
public class TwitterDialog extends Dialog {
    static final float[] DIMENSIONS_LANDSCAPE = { 460, 260 };
    static final float[] DIMENSIONS_PORTRAIT = { 280, 420 };
    static final FrameLayout.LayoutParams FILL = new FrameLayout.LayoutParams(
        ViewGroup.LayoutParams.FILL_PARENT,
        ViewGroup.LayoutParams.FILL_PARENT);
    static final int MARGIN = 4;
    static final int PADDING = 2;
    private final String mUrl;
    private final TwDialogListener mListener;
    private ProgressDialog mSpinner;
    private WebView mWebView;
    private LinearLayout mContent;
    private TextView mTitle;
    private boolean progressDialogRunning = false;
    public TwitterDialog(Context context, String url, TwDialogListener listener) {
    super(context);
    mUrl = url;
    mListener = listener;
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mSpinner = new ProgressDialog(getContext());
    mSpinner.requestWindowFeature(Window.FEATURE_NO_TITLE);
    mSpinner.setMessage("Loading...");
    mContent = new LinearLayout(getContext());
    mContent.setOrientation(LinearLayout.VERTICAL);
    setUpTitle();
    setUpWebView();
    Display display = getWindow().getWindowManager().getDefaultDisplay();
    final float scale = getContext().getResources().getDisplayMetrics().density;
    float[] dimensions = (display.getWidth() < display.getHeight()) ? DIMENSIONS_PORTRAIT
        : DIMENSIONS_LANDSCAPE;
    addContentView(mContent, new FrameLayout.LayoutParams(
        (int) (dimensions[0] * scale + 0.5f), (int) (dimensions[1]
            * scale + 0.5f)));
    }

    private void setUpTitle() {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    mTitle = new TextView(getContext());
    mTitle.setText("Twitter");
    mTitle.setTextColor(Color.WHITE);
    mTitle.setTypeface(Typeface.DEFAULT_BOLD);
    mTitle.setBackgroundColor(0xFFbbd7e9);
    mTitle.setPadding(MARGIN + PADDING, MARGIN, MARGIN, MARGIN);
    mTitle.setCompoundDrawablePadding(MARGIN + PADDING);
    //mTitle.setCompoundDrawablesWithIntrinsicBounds(icon, null, null, null);
    mContent.addView(mTitle);
    }
    @SuppressLint("SetJavaScriptEnabled")
    private void setUpWebView() {
    mWebView = new WebView(getContext());
    mWebView.setVerticalScrollBarEnabled(false);
    mWebView.setHorizontalScrollBarEnabled(false);
    mWebView.setWebViewClient(new TwitterWebViewClient());
    mWebView.getSettings().setJavaScriptEnabled(true);
    mWebView.loadUrl(mUrl);
    mWebView.setLayoutParams(FILL);
    mContent.addView(mWebView);
    }
    private class TwitterWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.startsWith(Twitter_Handler.CALLBACK_URL)) {
        mListener.onComplete(url);
        TwitterDialog.this.dismiss();
        return true;
        } else if (url.startsWith("authorize")) {
        return false;
        }
        return true;
    }
    @Override
    public void onReceivedError(WebView view, int errorCode,
        String description, String failingUrl) {
        super.onReceivedError(view, errorCode, description, failingUrl);
        mListener.onError(description);
        TwitterDialog.this.dismiss();
    }
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
        mSpinner.show();
        progressDialogRunning = true;
    }
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        String title = mWebView.getTitle();
        if (title != null && title.length() > 0) {
        mTitle.setText(title);
        }
        progressDialogRunning = false;
        mSpinner.dismiss();
    }
    }
    @Override
    protected void onStop() {
    progressDialogRunning = false;
    super.onStop();
    }
    @Override
    public void onBackPressed() {
    if (!progressDialogRunning) {
        TwitterDialog.this.dismiss();
    }
    }
}



TwitterSession
-----------------
public class TwitterSession {
    private final SharedPreferences sharedPref;
    private final Editor editor;

    private static final String TWEET_AUTH_KEY = "auth_key";
    private static final String TWEET_AUTH_SECRET_KEY = "auth_secret_key";
    private static final String TWEET_USER_NAME = "user_name";
    private static final String SHARED = "Twitter_Preferences";

    public TwitterSession(Context context)
    {
        sharedPref = context.getSharedPreferences(SHARED, Context.MODE_PRIVATE);
        editor = sharedPref.edit();
    }
    public void storeAccessToken(AccessToken accessToken, String username)
    {
        editor.putString(TWEET_AUTH_KEY, accessToken.getToken());
        editor.putString(TWEET_AUTH_SECRET_KEY, accessToken.getTokenSecret());
        editor.putString(TWEET_USER_NAME, username);
        editor.commit();
    }
    public void resetAccessToken()
    {
        editor.putString(TWEET_AUTH_KEY, null);
        editor.putString(TWEET_AUTH_SECRET_KEY, null);
        editor.putString(TWEET_USER_NAME, null);
   
        editor.commit();
    }
    public String getUsername()
    {
        return sharedPref.getString(TWEET_USER_NAME, "");
    }
    public AccessToken getAccessToken()
    {
        String token = sharedPref.getString(TWEET_AUTH_KEY, null);
        String tokenSecret = sharedPref.getString(TWEET_AUTH_SECRET_KEY, null);
        if (token != null && tokenSecret != null)
            return new AccessToken(token, tokenSecret);
        else
            return null;
    }
    public void clearsession()
    {
        editor.clear();
        editor.commit();
    }
    public void logoutFromTwitter()
    {
        // Clear the shared preferences
        Editor e = sharedPref.edit();
        e.remove(TWEET_AUTH_KEY);
        e.remove(TWEET_AUTH_SECRET_KEY);
        e.remove(TWEET_USER_NAME);
        e.commit();
          
    }
}


















No comments:

Post a Comment