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)
-
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); }
-
First, your
CALLBACKURL = "T4J_OAuth://callback_main"
is wrong when compare with yourmanifest
, it should be:CALLBACKURL = "T4J_OAuth:///"
Second:
android:launchMode="singleTop"
should beandroid:launchMode="singleInstance"
Maybe there are some more bugs, but you should fix it yourseft!
Edited: You should declare
Provider
andConsumer
: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);
andprovider.retrieveAccessToken(consumer, verifier);
Edited Look at this tutorial, just change the
CallBack_Url = "..."
toCallBack_URL = "callback:///"
and using below code to createTwitter
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 yourtwitter 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 usedsignpost
lib to getverifier
:String verifier = data .getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER);
I think you should try to usesignpost
lib!
Originally posted 2013-11-16 20:53:07.