【问题标题】:Android Twitter can't retrieve accestokenAndroid Twitter 无法检索访问令牌
【发布时间】:2011-09-30 20:01:43
【问题描述】:

我在调用时收到错误“请求令牌或令牌密码未在服务器回复中设置。您使用的服务提供商可能有问题。”

provider.RetrieveAccesstoken(comsumer, verifier);

但奇怪的是我有时只会收到此错误。首先,我的代码有效,我发布了一条消息。然后第二天我尝试在我的

上重新安装该应用程序

家用电脑我收到了这个错误。回到我的工作站,我再次遇到了同样的错误,但在按下启动程序的按钮后,它再次工作并且

在 Twitter 上发布了一条消息。这到底是怎么回事?!谁能解释一下?

我在 android 2.2 上运行了 2 个模拟器,它在 WQVGA400 上运行的频率更高,然后在 WVGA800 模拟器上运行:S

我还收到通知“BufferedReader 构造函数中使用的默认缓冲区大小。如果需要 8k 字符的缓冲区,最好是明确的。”

这是否与我的记忆或存储令牌机密有关?听起来服务太忙,无法在联系时回复。

代码

为了便于阅读,我删除了异常和导入

公共类 TestAgainActivity 扩展 Activity {

private String CONSUMER_KEY = "xxxxx";
private String CONSUMER_SECRET = "xxxxxxxxxxxx";
private String CALLBACK_URL = "myapp://twit";
private OAuthConsumer consumer; 
private OAuthProvider provider;
private String authUrl;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button loginButton = new Button(this);
    loginButton = (Button)findViewById(R.id.button1);
    loginButton.setOnClickListener(login);

    consumer = new CommonsHttpOAuthConsumer(  
            CONSUMER_KEY, CONSUMER_SECRET);  

    provider = new DefaultOAuthProvider(
            "https://api.twitter.com/oauth/request_token",
            "https://api.twitter.com/oauth/access_token",  
            "https://api.twitter.com/oauth/authorize");  

}
private OnClickListener login = new OnClickListener() {
    public void onClick(View v) {
        AskOauth();
    }           

};

public void AskOauth(){

    try {

        authUrl = provider.retrieveRequestToken(consumer, CALLBACK_URL);

    Here i store the Consumer token and tokenSecret
        SharedPreferences savedTokens = getSharedPreferences("savedTokens", 0);
        SharedPreferences.Editor editor = savedTokens.edit();
        editor.putString("savedToken", consumer.getToken());
        editor.putString("savedTokenSecret", consumer.getTokenSecret());
        editor.commit();

        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl)));

    } catches{
}

}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();

    SharedPreferences savedTokens = getSharedPreferences("savedTokens", 0);
    String saved_token = savedTokens.getString("savedToken", "empty ShP");
    String saved_tokenSecret = savedTokens.getString("savedTokenSecret", "empty ShP");
    consumer.setTokenWithSecret(saved_token, saved_tokenSecret);

    System.out.println("consumer token "+consumer.getToken());
    System.out.println("consumer tokenSecret "+consumer.getTokenSecret());

Uri uri = this.getIntent().getData();  


    if (uri != null && uri.toString().startsWith(CALLBACK_URL)) {

      SharedPreferences savedTokens = getSharedPreferences("savedTokens", 0);
      String saved_token = savedTokens.getString("savedToken", "empty ShP");
  String saved_tokenSecret = savedTokens.getString("savedTokenSecret", "empty ShP");
      consumer.setTokenWithSecret(saved_token, saved_tokenSecret);

        String verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER);  

        try {

        Here i sometime get the error! 
        provider.retrieveAccessToken(consumer, verifier);
        AccessToken accesToken = new AccessToken(consumer2.getToken(), consumer2.getTokenSecret());

        Twitter twitter = new TwitterFactory().getInstance();
        twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
                twitter.setOAuthAccessToken(accesToken);
                Date d = new Date(System.currentTimeMillis());
                String tweet = "This message is tweeted " + d.toLocaleString();
                try {
                twitter.updateStatus(tweet);
            } catch (TwitterException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }      

        } catch (OAuthMessageSignerException e1) {
        }

【问题讨论】:

  • 我看到该应用程序还允许消费者和提供者是通用的和 http,因此您可以拥有 -private OAuthProvider 提供者; -private CommonsHttpOAuthConsumer 消费者; -private CommonsHttpOAuthProvider 提供者2; -私人OAuthConsumer消费者2;但这似乎并不重要

标签: android authentication twitter oauth


【解决方案1】:

成功了! 而不是使用 Oath 路标库

provider.retrieveAccessToken(consumer,verifier)

我使用了 twitter4j 库

getOAuthAccessToken(requestToken, 验证者)

    String verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER);
    Twitter twitter = new TwitterFactory().getInstance();
    twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
    AccessToken accessToken = null;//get stored request tokens from database
    mDbHelper = DbAdapter.getInstance();
    mDbHelper.open();
    String[] dbRequestTokens = mDbHelper.getTwitterRequestTokens();
    mDbHelper.close();
    RequestToken requestToken = new RequestToken(dbRequestTokens[0], dbRequestTokens[1]);
    try {
        accessToken = twitter.getOAuthAccessToken(requestToken, verifier);
        //dataBase store accessTokens to tweet message  or acces other twitter recources, and don't forget to set the OAuth Consumer with consumer key and secret
        mDbHelper.open();
        mDbHelper.setTwitterAccessTokens(accessToken.getToken(), accessToken.getTokenSecret());
        mDbHelper.close();
        return "logged in succesfully";
        } catch (TwitterException e) {
        e.printStackTrace();
        return e.getMessage();
    }

【讨论】:

    猜你喜欢
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多