将Twitter4j v3.0.3集成到android应用程序-获取时间线并发布Tweet[工作]

将Twitter4j v3.0.3集成到android应用程序-获取时间线并发布Tweet[工作],android,twitter,twitter4j,Android,Twitter,Twitter4j,安卓2.3.3 重要提示:::我对整合twitter和facebook的东西非常陌生。我需要将新的twitter4j集成到我的应用程序中,并偶然发现了几个例子来解决我的问题。我的要求是从时间线上获取推文。但是,下面的示例还包含如何从应用程序更新tweet 注2:我使用了和中的示例。所有的功劳都归于这些网站的人。我做了一些改变,效果很好 该代码几乎是不言自明的,如果您需要任何其他澄清,请访问上述网站 以下是我所做的: 在Twitter上注册了Dev帐户,获得了“消费者密钥”和“消费者秘密”。在代

安卓2.3.3

重要提示:::我对整合twitter和facebook的东西非常陌生。我需要将新的twitter4j集成到我的应用程序中,并偶然发现了几个例子来解决我的问题。我的要求是从时间线上获取推文。但是,下面的示例还包含如何从应用程序更新tweet

注2:我使用了和中的示例。所有的功劳都归于这些网站的人。我做了一些改变,效果很好

该代码几乎是不言自明的,如果您需要任何其他澄清,请访问上述网站


以下是我所做的:

  • 在Twitter上注册了Dev帐户,获得了“消费者密钥”和“消费者秘密”。在代码中找到使用者密钥和使用者机密的常量时替换它们

  • 从下载twitter4j-3.0.3.zip

  • 从twitter-3.0.3->lib中提取zip文件并添加库。在测试集成时,我添加了所有库。您可能需要添加所需的库

  • 右键单击项目->属性->Java构建路径->库->添加JAR。转到项目中的lib文件夹并添加所有库


  • 请遵循这些步骤,您将拥有与twitter集成的应用程序

    为了使用该应用程序在twitter上发布tweet,我使用了来自的示例。 为了从twitter获取时间线,我使用了来自的示例


    代码:

    AndroidManifest.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.twitt4jintegrationdemo"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            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="com.example.twitt4jintegrationdemo.MainActivity"
                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>
    
    </manifest>
    
    MainActivity.java

    package com.example.twitt4jintegrationdemo;
    
    import java.util.List;
    
    import com.example.twitt4jintegrationdemo.R;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    
    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 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 = "o4YaT3H0SgmjQFSkGJy1A";
        static String TWITTER_CONSUMER_SECRET = "uxCIVsaPSsvckIBpSfZCLYGli0jHus4xMkE5sgk";
    
        // 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;
    
        Button btnGetTimeLine;
    
        // 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;
    
        // 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);
    
            btnGetTimeLine = (Button) findViewById(R.id.btnGetTimeLine);
    
            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();
                }
            });
    
            /**
             * Button click event for getting timeline from twitter *
             **/
            btnGetTimeLine.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    // call getTimeLine function
                    new getTimeLine().execute();
                }
            });
    
            /**
             * 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);
    
                    try {
                        // Get the access token
                        AccessToken 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());
    
                        // Hide login button
                        btnLoginTwitter.setVisibility(View.GONE);
    
                        // Show Update Twitter
                        lblUpdate.setVisibility(View.VISIBLE);
                        txtUpdate.setVisibility(View.VISIBLE);
                        btnUpdateStatus.setVisibility(View.VISIBLE);
    
                        btnGetTimeLine.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());
                    }
                }
            }
    
        }
    
        /**
         * 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);
                    this.startActivity(new Intent(Intent.ACTION_VIEW, Uri
                            .parse(requestToken.getAuthenticationURL())));
                } catch (TwitterException e) {
                    e.printStackTrace();
                }
            } 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());
                }
                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
            btnGetTimeLine.setVisibility(View.GONE);
            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();
        }
    
        /**
         * Function to get timeline
         * */
        class getTimeLine extends AsyncTask<Void, Void, String> {
    
            /**
             * Before starting background thread Show Progress Dialog
             * */
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                pDialog = new ProgressDialog(MainActivity.this);
                pDialog.setMessage("Getting Timeline from Twitter...");
                pDialog.setIndeterminate(false);
                pDialog.setCancelable(false);
                pDialog.show();
            }
    
            /**
             * getting Places JSON
             * */
            protected String doInBackground(Void... args) {
    
                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);
    
    
                    //Twitter twitter = new TwitterFactory().getInstance();
                    User user = twitter.verifyCredentials();
                    List<twitter4j.Status> statuses = twitter.getHomeTimeline();
                    System.out.println("Showing @" + user.getScreenName()
                            + "'s home timeline.");
                    for (twitter4j.Status status : statuses) {
                        Log.d("Twitter","@" + status.getUser().getScreenName()
                                + " - " + status.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(),
                                "Retrieving TimeLine Done..", Toast.LENGTH_SHORT)
                                .show();
                    }
                });
            }
    
        }
    
    }
    
    package com.example.twitt4jintegrationdemo;
    导入java.util.List;
    导入com.example.twitt4jintegrationdemo.R;
    导入android.os.Bundle;
    导入android.app.Activity;
    导入android.view.Menu;
    导入twitter4j.Twitter;
    导入twitter4j.TwitterException;
    导入twitter4j.TwitterFactory;
    导入twitter4j.User;
    导入twitter4j.auth.AccessToken;
    导入twitter4j.auth.RequestToken;
    导入twitter4j.conf.Configuration;
    导入twitter4j.conf.ConfigurationBuilder;
    导入android.app.Activity;
    导入android.app.ProgressDialog;
    导入android.content.Intent;
    导入android.content.SharedReferences;
    导入android.content.SharedReferences.Editor;
    导入android.content.pm.ActivityInfo;
    导入android.net.Uri;
    导入android.os.AsyncTask;
    导入android.os.Bundle;
    导入android.text.Html;
    导入android.util.Log;
    导入android.view.view;
    导入android.widget.Button;
    导入android.widget.EditText;
    导入android.widget.TextView;
    导入android.widget.Toast;
    公共类MainActivity扩展了活动{
    //常数
    /**
    *在此处注册你的应用程序https://dev.twitter.com/apps/new 拿你的
    *消费者密钥和秘密
    * */
    静态字符串TWITTER_CONSUMER_KEY=“o4yat3h0sgmjqfskgj1a”;
    静态字符串TWITTER_CONSUMER_SECRET=“uxcivsapsscsvckibpsfzclygli0jhus4xmke5sgk”;
    //偏好常数
    静态字符串首选项\u NAME=“twitter\u oauth”;
    静态最终字符串PREF_KEY_OAUTH_TOKEN=“OAUTH_TOKEN”;
    静态最终字符串PREF_KEY_OAUTH_SECRET=“OAUTH_token_SECRET”;
    静态最终字符串PREF\u KEY\u TWITTER\u LOGIN=“isTwitterLogedIn”;
    静态最终字符串TWITTER\u CALLBACK\u URL=”oauth://t4jsample";
    //Twitter oauth URL
    静态最终字符串URL\u TWITTER\u AUTH=“AUTH\u URL”;
    静态最终字符串URL\u TWITTER\u OAUTH\u VERIFIER=“OAUTH\u VERIFIER”;
    静态最终字符串URL\u TWITTER\u OAUTH\u TOKEN=“OAUTH\u TOKEN”;
    //登录按钮
    按钮btnLoginTwitter;
    //更新状态按钮
    按钮btnUpdateStatus;
    按钮BTNgtimeline;
    //注销按钮
    按钮btnLogoutTwitter;
    //编辑文本以进行更新
    编辑文本更新;
    //lbl更新
    文本视图lblUpdate;
    文本视图lblUserName;
    //进度对话框
    ProgressDialog;
    //推特
    私有静态Twitter;
    私有静态RequestToken RequestToken;
    //共享首选项
    私有静态SharedReferences mSharedPreferences;
    //互联网连接检测器
    专用连接检测器cd;
    //警报对话框管理器
    AlertDialogManager alert=新建AlertDialogManager();
    @凌驾
    创建时的公共void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u Picture);
    cd=新连接检测器(getApplicationContext());
    //检查互联网是否存在
    如果(!cd.isConnectingToInternet()){
    //Internet连接不存在
    alert.showAlertDialog(MainActivity.this,
    “Internet连接错误”,
    “请连接到正在工作的Internet连接”,错误);
    //通过返回停止执行代码
    返回;
    }
    //检查是否设置了twitter键
    如果(TWITTER_CONSUMER_KEY.trim().length()==0
    ||TWITTER\u CONSUMER\u SECRET.trim().length()=0){
    //Internet连接不存在
    alert.showAlertDialog(MainActivity.this,“Twitter oAuth令牌”,
    “请先设置您的twitter oauth令牌!”,false);
    //通过返回停止执行代码
    返回;
    }
    //所有UI元素
    btnLoginTwitter=(按钮)findViewById(R.id.btnLoginTwitter);
    btnUpdateStatus=(按钮)findViewById(R.id.btnUpdateStatus);
    btnGetTimeLine=(按钮)findViewById(R.id.btnGetTimeLine);
    btnLogoutTwitter=(按钮)findViewById(R.id.btnLogoutTwitter);
    txtUpdate=(EditText)findViewById(R.id.txtUpdateStatus);
    lblUpdate=(TextView)findViewById(R.id.lblUpdate);
    lblUserName=(TextView)findViewById(R.id.lblUserName);
    //共享首选项
    mSharedPreferences=getApplicationContext().GetSharedReferences(
    
    package com.example.twitt4jintegrationdemo;
    
    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 OK Button
                alertDialog.setButton(0, "OK",
                        new DialogInterface.OnClickListener() {
    
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // TODO Auto-generated method stub
    
                            }
                        });
    
            alertDialog.show();
        }
    }
    
    package com.example.twitt4jintegrationdemo;
    
    import java.util.List;
    
    import com.example.twitt4jintegrationdemo.R;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    
    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 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 = "o4YaT3H0SgmjQFSkGJy1A";
        static String TWITTER_CONSUMER_SECRET = "uxCIVsaPSsvckIBpSfZCLYGli0jHus4xMkE5sgk";
    
        // 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;
    
        Button btnGetTimeLine;
    
        // 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;
    
        // 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);
    
            btnGetTimeLine = (Button) findViewById(R.id.btnGetTimeLine);
    
            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();
                }
            });
    
            /**
             * Button click event for getting timeline from twitter *
             **/
            btnGetTimeLine.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    // call getTimeLine function
                    new getTimeLine().execute();
                }
            });
    
            /**
             * 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);
    
                    try {
                        // Get the access token
                        AccessToken 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());
    
                        // Hide login button
                        btnLoginTwitter.setVisibility(View.GONE);
    
                        // Show Update Twitter
                        lblUpdate.setVisibility(View.VISIBLE);
                        txtUpdate.setVisibility(View.VISIBLE);
                        btnUpdateStatus.setVisibility(View.VISIBLE);
    
                        btnGetTimeLine.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());
                    }
                }
            }
    
        }
    
        /**
         * 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);
                    this.startActivity(new Intent(Intent.ACTION_VIEW, Uri
                            .parse(requestToken.getAuthenticationURL())));
                } catch (TwitterException e) {
                    e.printStackTrace();
                }
            } 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());
                }
                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
            btnGetTimeLine.setVisibility(View.GONE);
            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();
        }
    
        /**
         * Function to get timeline
         * */
        class getTimeLine extends AsyncTask<Void, Void, String> {
    
            /**
             * Before starting background thread Show Progress Dialog
             * */
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                pDialog = new ProgressDialog(MainActivity.this);
                pDialog.setMessage("Getting Timeline from Twitter...");
                pDialog.setIndeterminate(false);
                pDialog.setCancelable(false);
                pDialog.show();
            }
    
            /**
             * getting Places JSON
             * */
            protected String doInBackground(Void... args) {
    
                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);
    
    
                    //Twitter twitter = new TwitterFactory().getInstance();
                    User user = twitter.verifyCredentials();
                    List<twitter4j.Status> statuses = twitter.getHomeTimeline();
                    System.out.println("Showing @" + user.getScreenName()
                            + "'s home timeline.");
                    for (twitter4j.Status status : statuses) {
                        Log.d("Twitter","@" + status.getUser().getScreenName()
                                + " - " + status.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(),
                                "Retrieving TimeLine Done..", Toast.LENGTH_SHORT)
                                .show();
                    }
                });
            }
    
        }
    
    }