开发者

problem with using twitter4j on android

I am using twitter4j and oauth-signpost for integrating twitter with my android app. I have implemented part of the activity, what it does is it authenticates the user (or atleast thats what its supposed to do). The problem is, it cant find the token and gives this error message:

09-22 15:44:06.123: DEBUG/TwitterApp(363): Error getting access token
09-22 15:44:06.134: WARN/System.err(363): oauth.signpost.exception.OAuthExpectationFailedException: Request token or token secret not set in server reply. The service provider you use is probably buggy.
09-22 15:44:06.194: WARN/System.err(363):     at oauth.signpost.AbstractOAuthProvider.retrieveToken(AbstractOAuthProvider.java:202)
09-22 15:44:06.194: WARN/System.err(363):     at oauth.signpost.AbstractOAuthProvider.retrieveAccessToken(AbstractOAuthProvider.java:97)
09-22 15:44:06.194: WARN/System.err(363):     at corp.encameo.app.TwitterApp$3.run(TwitterApp.java:139)

activity code:

            public class TwitterActivity extends Activity {

                private TwitterApp mTwitter;

                private static final String twitter_consumer_key = "xxx";
                private static final String twitter_secret_key = "xxx";


                String FILENAME = "AndroidSSO_data";
                private SharedPreferences mPrefs;
                String name="";
                String bitly="";
                String imageLink="";

                EditText linkText;
                EditText descText;
                ImageButton backButton;

                public ImageLoader imageLoader; 

                @Override
                public void onCreate(Bundle savedInstanceState) {

                    super.onCreate(savedInstanceState);
                    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
                    setContentView(R.layout.twitter);
                    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.window_title3);

                    TextView title=(TextView) findViewById(R.id.title_text_view_success3);
                    title.setText("Share on Twitter");

                    imageLoader=new ImageLoader(getApplicationContext());

                    linkText = (EditText) findViewById(R.id.twedit11);
                    descText = (EditText) findViewById(R.id.twedit22);

                    linkText.setFocusable(false);

                    mTwitter    = new TwitterApp(this, twitter_consumer_key,twitter_secret_key);

                    mTwitter.setListener(mTwLoginDialogListener);

                    if (mTwitter.hasAccessToken()) 
                    {
                        String username = mTwitter.getUsername();
                        username        = (username.equals("")) ? "Unknown" : username;
                    }

                    else
                    {
                         mTwitter.authorize();
                    }




                    Bundle extras = getIntent().getExtras();
                    if(extras !=null) 
                    {
                        name = extras.getString("name");
                        bitly = extras.getString("bitly");
                        imageLink = extras.getString("imageLink");
                    }

                    if (bitly.equalsIgnoreCase(""))bitly="http://www.encameo.com";

                    linkText.setText(bitly);
                    linkText.setEnabled(false);

                    ImageView image=(ImageView) findViewById(R.id.twicon);

                    imageLoader.DisplayImage(imageLink, this, image);

                    Button twButton = (Button) findViewById(R.id.twButton);

                    twButton.setOnClickListener(new View.OnClickListener() {
                      public void onClick(View v){


                          finish();

                      }
                     });

                    backButton = (ImageButton) findViewById(R.id.back_button3);

                    backButton.setOnClickListener(new View.OnClickListener() 
                    {
                        public void onClick(View v)
                        {
                           System.out.println("!!! BACK !!!");
                           //finishActivity(0);
                   开发者_如何学C        onBackPressed();
                        }
                    });
                }

                private final TwDialogListener mTwLoginDialogListener = new corp.encameo.app.TwitterApp.TwDialogListener() {
                    public void onComplete(String value) {
                        String username = mTwitter.getUsername();
                        username        = (username.equals("")) ? "No Name" : username;

                        Toast.makeText(TwitterActivity.this, "Connected to Twitter as " + username, Toast.LENGTH_LONG).show();
                    }

                    public void onError(String value) {

                        Toast.makeText(TwitterActivity.this, "Twitter connection failed", Toast.LENGTH_LONG).show();
                    }
                };


            }

TwitterApp class:

            public class TwitterApp {
                private Twitter mTwitter;
                private TwitterSession mSession;
                private AccessToken mAccessToken;
                private CommonsHttpOAuthConsumer mHttpOauthConsumer;
                private OAuthProvider mHttpOauthprovider;
                private String mConsumerKey;
                private String mSecretKey;
                private ProgressDialog mProgressDlg;
                private TwDialogListener mListener;
                private Context context;

                public static final String CALLBACK_URL = "twitterapp://connect";
                private static final String TAG = "TwitterApp";

                public TwitterApp(Context context, String consumerKey, String secretKey) {
                    this.context    = context;

                    mTwitter        = new TwitterFactory().getInstance();
                    mSession        = new TwitterSession(context);
                    mProgressDlg    = new ProgressDialog(context);

                    mProgressDlg.requestWindowFeature(Window.FEATURE_NO_TITLE);

                    mConsumerKey    = consumerKey;
                    mSecretKey      = secretKey;

                    mHttpOauthConsumer = new CommonsHttpOAuthConsumer(mConsumerKey, mSecretKey);
                    mHttpOauthprovider = new DefaultOAuthProvider("https://api.twitter.com/oauth/request_token",
                                                                 "https://api.twitter.com/oauth/access_token",
                                                                 "https://api.twitter.com/oauth/authorize");

                    mAccessToken    = mSession.getAccessToken();

                    configureToken();
                }

                public void setListener(TwDialogListener listener) {
                    mListener = listener;
                }

                @SuppressWarnings("deprecation")
                private void configureToken() {
                    if (mAccessToken != null) {
                        mTwitter.setOAuthConsumer(mConsumerKey, mSecretKey);

                        mTwitter.setOAuthAccessToken(mAccessToken);
                    }
                }

                public boolean hasAccessToken() {
                    return (mAccessToken == null) ? false : true;
                }

                public void resetAccessToken() {
                    if (mAccessToken != null) {
                        mSession.resetAccessToken();

                        mAccessToken = null;
                    }
                }

                public String getUsername() {
                    return mSession.getUsername();
                }

                public void updateStatus(String status) throws Exception {
                    try {
                        mTwitter.updateStatus(status);
                    } catch (TwitterException e) {
                        throw e;
                    }
                }

                public void authorize() {
                    mProgressDlg.setMessage("Initializing ...");
                    mProgressDlg.show();

                    new Thread() {
                        @Override
                        public void run() {
                            String authUrl = "";
                            int what = 1;

                            try {
                                authUrl = mHttpOauthprovider.retrieveRequestToken(mHttpOauthConsumer, CALLBACK_URL);    

                                what = 0;

                                Log.d(TAG, "Request token url " + authUrl);
                            } catch (Exception e) {
                                Log.d(TAG, "Failed to get request token");

                                e.printStackTrace();
                            }

                            mHandler.sendMessage(mHandler.obtainMessage(what, 1, 0, authUrl));
                        }
                    }.start();
                }

                public void processToken(String callbackUrl)  {
                    mProgressDlg.setMessage("Finalizing ...");
                    mProgressDlg.show();

                    final String verifier = getVerifier(callbackUrl);

                    new Thread() {
                        @Override
                        public void run() {
                            int what = 1;

                            try {
                                mHttpOauthprovider.retrieveAccessToken(mHttpOauthConsumer, verifier);

                                mAccessToken = new AccessToken(mHttpOauthConsumer.getToken(), mHttpOauthConsumer.getTokenSecret());

                                configureToken();

                                User user = mTwitter.verifyCredentials();

                                mSession.storeAccessToken(mAccessToken, user.getName());

                                what = 0;
                            } catch (Exception e){
                                Log.d(TAG, "Error getting access token");

                                e.printStackTrace();
                            }

                            mHandler.sendMessage(mHandler.obtainMessage(what, 2, 0));
                        }
                    }.start();
                }

                private String getVerifier(String callbackUrl) {
                    String verifier  = "";

                    try {
                        callbackUrl = callbackUrl.replace("twitterapp", "http");

                        URL url         = new URL(callbackUrl);
                        String query    = url.getQuery();

                        String array[]  = query.split("&");

                        for (String parameter : array) {
                             String v[] = parameter.split("=");

                             if (URLDecoder.decode(v[0]).equals(oauth.signpost.OAuth.OAUTH_VERIFIER)) {
                                 verifier = URLDecoder.decode(v[1]);
                                 break;
                             }
                        }
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    }

                    return verifier;
                }

                private void showLoginDialog(String url) {
                    final TwDialogListener listener = new TwDialogListener() {
                        @Override
                        public void onComplete(String value) {
                            processToken(value);
                        }

                        @Override
                        public void onError(String value) {
                            mListener.onError("Failed opening authorization page");
                        }
                    };

                    new TwitterDialog(context, url, listener).show();
                }

                private Handler mHandler = new Handler() {
                    @Override
                    public void handleMessage(Message msg) {
                        mProgressDlg.dismiss();

                        if (msg.what == 1) {
                            if (msg.arg1 == 1)
                                mListener.onError("Error getting request token");
                            else
                                mListener.onError("Error getting access token");
                        } else {
                            if (msg.arg1 == 1)
                                showLoginDialog((String) msg.obj);
                            else
                                mListener.onComplete("");
                        }
                    }
                };

                public interface TwDialogListener {
                    public void onComplete(String value);       

                    public void onError(String value);
                }
            }

any suggestions ???

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜