如果你想在没有用户身份验证的情况下获取推文,你可以使用Application-only Authentication,因为用户不需要登录。
通过仅应用程序身份验证,Twitter 为应用程序提供了代表应用程序本身(而不是代表特定用户)发出经过身份验证的请求的能力
仅限应用程序的身份验证流程遵循以下步骤:
应用程序将其消费者密钥和秘密编码为一组经过特殊编码的凭据。
应用程序向 POST oauth2/token 端点发出请求,以将这些凭证交换为不记名令牌。
访问 REST API 时,应用程序使用不记名令牌进行身份验证。
注意:因为 twitter4j 最近添加了这个功能,所以你应该使用最后一个快照库。
一个使用它的例子:
private ConfigurationBuilder builder;
private Twitter twitter;
private TwitterFactory factory;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.init_act_layout);
// setup
builder = new ConfigurationBuilder();
builder.setUseSSL(true);
builder.setApplicationOnlyAuthEnabled(true);
builder.setOAuthConsumerKey(Constants.CONSUMER_KEY);
builder.setOAuthConsumerSecret(Constants.CONSUMER_SECRET);
Configuration configuration = builder.build();
factory = new TwitterFactory(configuration);
((MyApp) (MyApp.getApp())).setTFactory(factory);
if (isNeededTwitterAuth()) {
twitter = factory.getInstance();
//Get the token async and save it
}
//Search tweets
}
/*
* Checks if twitter access token is already saved in preferences
*
* @return true if auth needed
*/
private boolean isNeededTwitterAuth() {
SharedPreferences settings = getSharedPreferences(Constants.TWITTER_PREFERENCES, Context.MODE_PRIVATE);
String twitterAccesToken = settings.getString("bearerAccessToken", "");
String twitterTokenType = settings.getString("bearerTokenType", "");
return ((twitterAccesToken.length() == 0) && (twitterTokenType.length() == 0));
}
}
要获取不记名令牌,请在主 UI 线程之外执行以避免网络异常,使用 AsyncTask:
@Override
protected OAuth2Token doInBackground(Void... params) {
OAuth2Token bearerToken = null;
try {
bearerToken = twitter.getOAuth2Token();
} catch (TwitterException e) {
e.printStackTrace();
}
return bearerToken;
}
当您获得不记名令牌时,将其保存:
SharedPreferences appSettings = getSharedPreferences(Constants.TWITTER_PREFERENCES, MODE_PRIVATE);
SharedPreferences.Editor prefEditor = appSettings.edit();
prefEditor.putString("bearerAccessToken", result.getAccessToken());
prefEditor.putString("bearerTokenType", result.getTokenType());
prefEditor.commit();
并使用不记名令牌:
OAuth2Token bearerToken = new OAuth2Token(bearerTokenType, bearerAccesstoken);
twitter.setOAuth2Token(bearerToken);
并搜索推文(总是在主线程之外):
@Override
protected QueryResult doInBackground(Void... params) {
twitter.setOAuth2Token(bearerToken);
Query query = new Query();
[...]
result = twitter.search(query);
博客中的完整解释(西班牙语...)
以及twitter4j github中的完整示例
希望能帮助到你!