twitter4j code does not work on ICS and JellyBean-Collection of common programming errors

I am using twitter4J to post tweet on twitter

Here i Change the Code according to your suggestion . i do some google search. The problem is When i try to shift from main activity to twitter activity it show force close. Main activity is = “MainActivity” twitter activity is = “twiti_backup” I think there is problem in Manifestfile but i dont know what was it.

public class twiti_backup extends Activity {

private static final String TAG = "Blundell.TweetToTwitterActivity";


private static final String PREF_ACCESS_TOKEN = "";

private static final String PREF_ACCESS_TOKEN_SECRET = "";

private static final String CONSUMER_KEY = "";

private static final String CONSUMER_SECRET = ""; 
private static final String CALLBACK_URL = "android:///";

private SharedPreferences mPrefs;

private Twitter mTwitter;

private RequestToken mReqToken;

private Button mLoginButton;
private Button mTweetButton;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.i(TAG, "Loading TweetToTwitterActivity");
    setContentView(R.layout.twite);


    mPrefs = getSharedPreferences("twitterPrefs", MODE_PRIVATE);

    mTwitter = new TwitterFactory().getInstance();

    mTwitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);


    mLoginButton = (Button) findViewById(R.id.login_button);
    mTweetButton = (Button) findViewById(R.id.tweet_button);
}


public void buttonLogin(View v) {
    Log.i(TAG, "Login Pressed");
    if (mPrefs.contains(PREF_ACCESS_TOKEN)) {
        Log.i(TAG, "Repeat User");
        loginAuthorisedUser();
    } else {
        Log.i(TAG, "New User");
        loginNewUser();
    }
}


public void buttonTweet(View v) {
    Log.i(TAG, "Tweet Pressed");
    tweetMessage();
}


private void loginNewUser() {
    try {
        Log.i(TAG, "Request App Authentication");
        mReqToken = mTwitter.getOAuthRequestToken(CALLBACK_URL);

        Log.i(TAG, "Starting Webview to login to twitter");
        WebView twitterSite = new WebView(this);
        twitterSite.loadUrl(mReqToken.getAuthenticationURL());
        setContentView(twitterSite);

    } catch (TwitterException e) {
        Toast.makeText(this, "Twitter Login error, try again later", Toast.LENGTH_SHORT).show();
    }
}


private void loginAuthorisedUser() {
    String token = mPrefs.getString(PREF_ACCESS_TOKEN, null);
    String secret = mPrefs.getString(PREF_ACCESS_TOKEN_SECRET, null);

    // Create the twitter access token from the credentials we got previously
    AccessToken at = new AccessToken(token, secret);

    mTwitter.setOAuthAccessToken(at);

    Toast.makeText(this, "Welcome back", Toast.LENGTH_SHORT).show();

    enableTweetButton();
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    Log.i(TAG, "New Intent Arrived");
    dealWithTwitterResponse(intent);
}

@Override
protected void onResume() {
    super.onResume();
    Log.i(TAG, "Arrived at onResume");
}


private void dealWithTwitterResponse(Intent intent) {
    Uri uri = intent.getData();
    if (uri != null && uri.toString().startsWith(CALLBACK_URL)) { // If the user has just logged in
        String oauthVerifier = uri.getQueryParameter("oauth_verifier");

        authoriseNewUser(oauthVerifier);
    }
}


private void authoriseNewUser(String oauthVerifier) {
    try {
        AccessToken at = mTwitter.getOAuthAccessToken(mReqToken, oauthVerifier);
        mTwitter.setOAuthAccessToken(at);

        saveAccessToken(at);

        // Set the content view back after we changed to a webview
        setContentView(R.layout.twite);

        enableTweetButton();
    } catch (TwitterException e) {
        Toast.makeText(this, "Twitter auth error x01, try again later", Toast.LENGTH_SHORT).show();
    }
}


private void enableTweetButton() {
    Log.i(TAG, "User logged in - allowing to tweet");
    mLoginButton.setEnabled(false);
    mTweetButton.setEnabled(true);
}


private void tweetMessage() {
    try {
        mTwitter.updateStatus("Test - Tweeting with @Blundell_apps #AndroidDev Tutorial using #Twitter4j http://blog.blundell-apps.com/sending-a-tweet/");

        Toast.makeText(this, "Tweet Successful!", Toast.LENGTH_SHORT).show();
    } catch (TwitterException e) {
        Toast.makeText(this, "Tweet error, try again later", Toast.LENGTH_SHORT).show();
    }
}

private void saveAccessToken(AccessToken at) {
    String token = at.getToken();
    String secret = at.getTokenSecret();
    Editor editor = mPrefs.edit();
    editor.putString(PREF_ACCESS_TOKEN, token);
    editor.putString(PREF_ACCESS_TOKEN_SECRET, secret);
    editor.commit();
}

}

And here is Manifest

  
    
        
            
            
        
    
         
            
            
                                         
  
    
     

Here is Log cat when i try to launch twiti_backup from main activity

W/dalvikvm(16357): threadid=1: thread exiting with uncaught exception (group=0x4001d5a0) 
E/AndroidRuntime(16357): FATAL EXCEPTION: main E/AndroidRuntime(16357): java.lang.VerifyError: com.example.uitest.twiti_backup
E/AndroidRuntime(16357): at java.lang.Class.newInstanceImpl(Native Method)
E/AndroidRuntime(16357): at java.lang.Class.newInstance(Class.java:1409)
E/AndroidRuntime(16357): at android.app.Instrumentation.newActivity(Instrumentation.java:1040)
E/AndroidRuntime(16357): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1735)
E/AndroidRuntime(16357): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1842)
E/AndroidRuntime(16357): at android.app.ActivityThread.access$1500(ActivityThread.java:132)
E/AndroidRuntime(16357): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1038)
E/AndroidRuntime(16357): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(16357): at android.os.Looper.loop(Looper.java:143)
E/AndroidRuntime(16357): at android.app.ActivityThread.main(ActivityThread.java:4263)
E/AndroidRuntime(16357): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(16357): at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime(16357): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
E/AndroidRuntime(16357): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
E/AndroidRuntime(16357): at dalvik.system.NativeStart.main(Native Method)
  1. Add below two line code into your main activity’s onCreate method after setcontentview() line, it will solve your problem.

    if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }
    
  2. First, your CALLBACKURL = "T4J_OAuth://callback_main" is wrong when compare with your manifest, it should be:CALLBACKURL = "T4J_OAuth:///"

    Second: android:launchMode="singleTop" should be android:launchMode="singleInstance"

    Maybe there are some more bugs, but you should fix it yourseft!

    Edited: You should declare Provider and Consumer:

    consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRETE);
    provider = new DefaultOAuthProvider(
                "http://twitter.com/oauth/request_token",
                "http://twitter.com/oauth/access_token",
                "http://twitter.com/oauth/authorize");
    provider.retrieveRequestToken(consumer, CALL_BACK);
    startActivity(new Intent(Intent.ACTION_VIEW, Uri
                        .parse(result)));
    

    Also, you should create some AsyncTask to call those statments: rovider.retrieveRequestToken(consumer, CALL_BACK); and provider.retrieveAccessToken(consumer, verifier);

    Edited Look at this tutorial, just change the CallBack_Url = "..." to CallBack_URL = "callback:///" and using below code to create Twitter object:

    ConfigurationBuilder cb = new ConfigurationBuilder();
    cb.setDebugEnabled(true).setOAuthConsumerKey(CONSUMER_KEY)
    .setOAuthConsumerSecret(CONSUMER_SECRETE)
    // accessTokenKey and accessTokenSecrete are what you get after redirecting
    //   back from your oauthentication
    .setOAuthAccessToken(accessTokenKey)
    .setOAuthAccessTokenSecret(accessTokenSecrete)
    .setMediaProviderAPIKey(TWITPIC_API_KEY);
    Configuration config = cb.build();
    TwitterFactory tf = new TwitterFactory(config);
    Twitter twitter = tf.getInstance();
    

    Notice: Don’t let the call back url property in your twitter app null, put any dummy link into it! (App of your twitter account!! not your android app!) Sorry if there’s any type error!

    Edit You got an Verifier error because of your verifier is wrong! I used signpost lib to get verifier: String verifier = data .getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER); I think you should try to use signpost lib!