Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

twitter not working with twitter4j in android

I am using twitter4j to integrate twitter in android. This is my code to for twitter. I am creating separate class for twitter.

I looked at similar questions to this but nothing works for me. Question and some other questions.

Twitter class

public class OBLTwitter {

private static final String TAG = "OBLTwitter";
private Activity activity;

// Twitter constants
private static final String TWITTER_CONSUMER_KEY = "KEY";
private static final String TWITTER_CONSUMER_SECRET = "SECRET";
public static final String TWITTER_CALLBACK_URL = "app://ridesharebuddy";

// Twitter variables
private static Twitter twitter;
private static RequestToken requestToken;
public static boolean userDeniedToContinue;

    public OBLTwitter(Activity activity) {

        Log.d(TAG, "Parameterized constructor called.");

        this.activity = activity;
        userDeniedToContinue = false;
    }


    // Login to twitter
    public void loginToTwitter() {

        Log.e(TAG, "Logging in to twitter.");

        if(!isNetworkAvailable(this.activity))
        {
            Log.e(TAG, "Interent connection not available");
        }

        // Set up Twitter object
        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();

        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {

                    if(twitter == null)
                    {
                        Log.e(TAG, "twitter is null");
                    }
                    Log.e("called", "called run method");
                    // Get RequestToken and call authentication URL to show
                    // twitter page
                    requestToken = twitter
                            .getOAuthRequestToken(TWITTER_CALLBACK_URL);

                    Log.e(TAG, "getting request token");

                    Log.e("oAuth token :", requestToken.getToken());
                    Log.e("oAUth secret:", requestToken.getTokenSecret());
                    Log.e("oAuth URL: ", requestToken.getAuthenticationURL());

                     activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri
                     .parse(requestToken.getAuthenticationURL())));

                } catch (TwitterException te) {

                    Log.e(TAG, "Twitter exception, Login error.");
                    te.printStackTrace();                       

                    Log.e(TAG, "Error code : " + te.getErrorCode());
                    Log.e(TAG, "Error message : " + te.getErrorMessage());
                    Log.e(TAG, "Status code : " + te.getStatusCode());
                    Log.e(TAG, "Access level : " + te.getAccessLevel());

                } catch (Exception e) {

                    e.printStackTrace();
                }
            }
        });

        thread.start();
    }

    public boolean isNetworkAvailable(Context context)
    {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null;
    }

}

This is my activity code from where i am calling loginToTwitter function.

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    OBLTwitter twitter = new OBLTwitter(this);
    twitter.loginToTwitter();
}

This is my manifest file, I am adding this because i made some changes suggested by answerers of different questions.

 <uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.INTERNET"/>
<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.objectlounge.OBLTwitter.MainActivity"
        android:label="@string/app_name" >
        android:launchMode="singleInstance">


        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />

            <data
                android:host="ridesharebuddy"
                android:scheme="app" />
        </intent-filter>
    </activity>
</application>

Error log

enter image description here

like image 408
keen Avatar asked Feb 15 '14 10:02

keen


People also ask

Why can t I download Twitter on Android?

If you're still unable to download the app, try uninstalling the Twitter app from your device. After it's uninstalled, restart your phone and then re-install the Twitter app from the Google Play Store. If you're still having trouble, check the Google Play Help Center for tips to troubleshoot download issues.

How to download the Twitter app?

Go to the app store on iOS or Google Play on Android. Search for the official Twitter app. See our bird logo? Then you know it's the right one.


2 Answers

The reason you are getting an HTTP 403 (Forbbiden) status code most likely has to do with the fact that Twitter has recently restricted its traffic to TLS only.

From Twitter's calendar of API changes:

January 14, 2014 Restricting api.twitter.com to TLS traffic only API v1.1

Several libraries that were using plain HTTP by default have been updated in order to comply with this. So was the case with Twitter4j. On version 3.0.5 it now uses TLS by default.

Now, if for some reason you really don't want to update the library, you might still be able to use your current version by doing a minor change to your code. The ConfigurationBuilder class has a setSSL method, which you can set to true to use HTTPS. So you might get it to work by adding the following line to your code:

builder.setSSL(true);
like image 130
Juan Andrés Diana Avatar answered Oct 30 '22 02:10

Juan Andrés Diana


The Status 403 error indicates that there's a problem with your login.

  • Check that you have successfully created an app on dev.twitter.com
  • Make sure you're using the right keys in the right places
  • Is your username / password correct
  • Finally, are you using the latest version of Twitter4J? Make sure that it is only using HTTP*S* URLs.
like image 42
Terence Eden Avatar answered Oct 30 '22 02:10

Terence Eden