【问题标题】:Sending tweets in background of application在应用程序后台发送推文
【发布时间】:2014-01-14 08:55:56
【问题描述】:

我已经在互联网上搜索过了。为了发送推文,我找到了许多解决方案,并且使用意图得到了更好的解决方案。

String tweetUrl = "https://twitter.com/intent/tweet?text=PUT TEXT HERE &url="+ "https://www.google.com";
Uri uri = Uri.parse(tweetUrl);
startActivity(new Intent(Intent.ACTION_VIEW, uri));

但我只想在后台发送推文。如果有人这样做过,请与我分享。我的要求是在帖子发布到我的基于社交网络的应用程序时在后台发送推文。我可以在 facebook 的情况下做到这一点,但仍然在 Twitter 上苦苦挣扎。

下面是我为 Twitter 应用程序进行身份验证的代码:-

class twAsyn extends AsyncTask<String, Void, String>{
    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub
         askOAuth();
        return null;  
    }

}

private void checkForSavedLogin() {  
     // Get Access Token and persist it  
     new accessUser().execute();
}  

class accessUser extends AsyncTask<String, Void, String>{

    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub
         AccessToken a = getAccessToken();  

            // storeAccessToken(a);
             loggedIUser.setTwSharing(true);
             if (a!=null) {

             // initialize Twitter4J  
             twitter = new TwitterFactory().getInstance();  
             twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);  
             twitter.setOAuthAccessToken(a);  
             ((TwitterApplication)getApplication()).setTwitter(twitter);  
             final User user;
             finish(); 
              }
        return null;
    }

}

private AccessToken getAccessToken() {
    SharedPreferences settings = getSharedPreferences(Constants.PREFS_NAME, MODE_PRIVATE);
    String token = settings.getString("accessTokenToken", "");
    String tokenSecret = settings.getString("accessTokenSecret", "");
    if (token!=null && tokenSecret!=null && !"".equals(tokenSecret) && !"".equals(token)){
        return new AccessToken(token, tokenSecret);
    }
    return null;
}

private void getConsumerProvider() {
    OAuthProvider p = ((TwitterApplication)getApplication()).getProvider();
    if (p!=null){
        provider = p;
    }
    CommonsHttpOAuthConsumer c = ((TwitterApplication)getApplication()).getConsumer();
    if (c!=null){
        consumer = c;
    }
}



private void setConsumerProvider() {
    if (provider!=null){
        ((TwitterApplication)getApplication()).setProvider(provider);
    }
    if (consumer!=null){
        ((TwitterApplication)getApplication()).setConsumer(consumer);
    }
}


private void storeAccessToken(AccessToken a) {
    SharedPreferences settings = getSharedPreferences(Constants.PREFS_NAME, MODE_PRIVATE);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString("accessTokenToken", a.getToken());
    editor.putString("accessTokenSecret", a.getTokenSecret());
    editor.commit();
}

@Override
protected void onResume() {
    super.onResume();
    System.out.println("RESUMING!!");
    if (this.getIntent()!=null && this.getIntent().getData()!=null){
        Uri uri = this.getIntent().getData();
        new twUserAcces(uri).execute();
    }
}

class twUserAcces extends AsyncTask<String, Void, String>{
    Uri uri;
    String verifier;
    public twUserAcces(Uri uri) {
        // TODO Auto-generated constructor stub
        this.uri = uri;
        if (uri != null && uri.toString().startsWith(CALLBACK_URL)) {
            verifier = uri.getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER);

        }
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        checkForSavedLogin();
    }

    @Override
    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub
        try {


            // this will populate token and token_secret in consumer
            provider.retrieveAccessToken(consumer, verifier);

            // Get Access Token and persist it

            System.out.println(">>>>>>>> accesstoker "+consumer.getToken());
            System.out.println(">>>>>>>> accesstoker "+consumer.getTokenSecret());
            AccessToken a = new AccessToken(consumer.getToken(), consumer.getTokenSecret());
            storeAccessToken(a);

            // initialize Twitter4J
            twitter = new TwitterFactory().getInstance();
            twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
            twitter.setOAuthAccessToken(a);
            ((TwitterApplication)getApplication()).setTwitter(twitter);
            Log.e("Login>>>>>>>>>>>>>>>>>>>>>.", "Twitter Initialised");


            User user = null;
            long h=twitter.getId();
            user = (User)twitter.getUserLists(0);

            finish();
        } catch (Exception e) {
            //Log.e(APP, e.getMessage());
            e.printStackTrace();
            System.out.println("e.getMessage()=="+e.getMessage());
            //Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
        }

        return null;
    }

}

private void askOAuth() {
    try {


        consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
        provider = new CommonsHttpOAuthProvider("https://twitter.com/oauth/request_token", "https://twitter.com/oauth/access_token", "https://twitter.com/oauth/authorize");
        String authUrl = provider.retrieveRequestToken(consumer, CALLBACK_URL);
        //Toast.makeText(this, "Please authorize this app!", Toast.LENGTH_LONG).show();
        setConsumerProvider();
        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl)));
    } catch (Exception e) {
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
    }
}

【问题讨论】:

标签: java android social-networking tweets


【解决方案1】:

在java中发送推文,你可以使用Twitter4J

创建一个 Twitter 应用程序:参考here

初始化您的对象:使用 twitter 应用凭据填写凭据

ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true)
  .setOAuthConsumerKey("")
  .setOAuthConsumerSecret("")
  .setOAuthAccessToken("")
  .setOAuthAccessTokenSecret("");
TwitterFactory tf = new TwitterFactory(cb.build());

发送您的推文

Twitter twitter = TwitterFactory.getSingleton();
Status status = twitter.updateStatus(latestStatus);

最佳实践请参考here

【讨论】:

  • 我尝试了同样的方法,但它一直响应错误。 “缺少身份验证凭据”
  • 你创建了你的推特应用了吗?确保您还创建了访问令牌。并且权限模型必须是可读写的
  • 请检查我的编辑答案。我粘贴了我的 Twitter 身份验证代码。可能有助于更好地理解。我也在使用 TwitterApplication 类。
  • 您能否调试您的代码以获取您的凭据?您可以记录它们。您的凭据错误。首先从日志中观看,并将其与 twitter 应用设置进行比较
  • 是的,它不一样。但是,当我使用 Right CONSUMER_KEY & CONSUMER_SECRET 时,我该如何控制它。
猜你喜欢
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 2016-06-03
相关资源
最近更新 更多