在android上使用twitter4j的问题

时间:2011-09-22 15:48:09

标签: android twitter4j

我使用twitter4j和oauth-signpost将twitter与我的Android应用程序集成。我已经实现了部分活动,它的作用是对用户进行身份验证(或至少是它应该做的事情)。问题是,它无法找到令牌并提供此错误消息:

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)

活动代码:

            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);
                           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类:

            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);
                }
            }

任何建议???

0 个答案:

没有答案