Android Twitter integration using oauth and twitter4j

后端 未结 5 1513
半阙折子戏
半阙折子戏 2020-12-02 09:04

I want to integrate twitter in an android application and found many tutorials. Implemented 2 of them. But after implementing, when ran the application, I came to know that

5条回答
  •  一个人的身影
    2020-12-02 09:29

    This is the working example from my code , i am using twitter4j and also you don't need to set any intent in manifest since i use webview instead of browser.

    Place your consumer and secret key and you should be good to go

    package com.example.mysituationtwittertest;
    
    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.SharedPreferences;
    import android.content.SharedPreferences.Editor;
    import android.net.Uri;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.widget.Button;
    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 = "XXXXXXXXXXXXXXXXXXX"; // place your
                                                                    // cosumer
                                                                    // key here
    static String TWITTER_CONSUMER_SECRET = "XXXXXXXXXXXXXXXX"; // place
                                                                                        // your
                                                                                        // consumer
                                                                                        // secret
                                                                                        // here
    
    // 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://youdare";
    
    // 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 btnShareTwitter;
    
    WebView myWebView;
    
    // Twitter
    private static Twitter twitter;
    private static RequestToken requestToken;
    private AccessToken accessToken;
    
    // Shared Preferences
    private static SharedPreferences mSharedPreferences;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        // All UI elements
        btnShareTwitter = (Button) findViewById(R.id.btnShareTwitter);
        myWebView = (WebView) findViewById(R.id.webView1);
    
        myWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView webView, String url) {
                if (url != null && url.startsWith(TWITTER_CALLBACK_URL))
                    new AfterLoginTask().execute(url);
                else
                    webView.loadUrl(url);
                return true;
            }
        });
    
        // Shared Preferences
        mSharedPreferences = getApplicationContext().getSharedPreferences(
                "MyPref", 0);
    
        /**
         * Twitter login button click event will call loginToTwitter() function
         * */
        btnShareTwitter.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View arg0) {
                // Call login twitter function
                new LoginTask().execute();
            }
        });
    
    }
    
    /**
     * 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);
            } catch (TwitterException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        }
    
        else {
            // user already logged into twitter
            Toast.makeText(getApplicationContext(),
                    "Already Logged into twitter", Toast.LENGTH_LONG).show();
        }
    }
    
    /**
     * 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);
    }
    
    public void handleTwitterCallback(String url) {
    
        Uri uri = Uri.parse(url);
    
        // oAuth verifier
        final String verifier = uri
                .getQueryParameter(URL_TWITTER_OAUTH_VERIFIER);
    
        try {
    
            // Get the access token
            MainActivity.this.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());
    
            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("XXXXXXXXXXXXXXXXX");
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    class LoginTask extends AsyncTask {
    
        @Override
        protected Boolean doInBackground(Void... params) {
            // TODO Auto-generated method stub
            loginToTwitter();
            return true;
        }
    
        @Override
        protected void onPostExecute(Boolean result) {
            // TODO Auto-generated method stub
    
            myWebView.loadUrl(requestToken.getAuthenticationURL());
            myWebView.setVisibility(View.VISIBLE);
            myWebView.requestFocus(View.FOCUS_DOWN);
    
        }
    
    }
    
    class AfterLoginTask extends AsyncTask {
    
        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            myWebView.clearHistory();
        }
    
        @Override
        protected Boolean doInBackground(String... params) {
            // TODO Auto-generated method stub
            handleTwitterCallback(params[0]);
            return true;
        }
    
        @Override
        protected void onPostExecute(Boolean result) {
            // TODO Auto-generated method stub
            myWebView.setVisibility(View.GONE);
            Toast.makeText(MainActivity.this, "Tweet Successful",
                    Toast.LENGTH_SHORT).show();
    
        }
    
    }
    
    @Override
    public void onBackPressed() {
        if (myWebView.getVisibility() == View.VISIBLE) {
            if (myWebView.canGoBack()) {
                myWebView.goBack();
                return;
            } else {
                myWebView.setVisibility(View.GONE);
                return;
            }
        }
        super.onBackPressed();
    }
    
    }
    

提交回复
热议问题