因此,我正在尝试使用Android中的Twitter4J库从公共Twitter时间轴(不是我自己的Twitter时间轴或我有管理员访问权限的任何内容,只是来自本地组织的公共时间轴)获取状态对象列表工作室,但我对文档感到有些困惑。我遇到了这个错误:“访问令牌格式无效。”
我确实在Twitter上创建了一个开发者帐户,并获得了一个消费者密钥和令牌,以及一个访问令牌和密码。这些值暂时保存在一组私有静态字符串中。 TWITTER_ZOO_ID是一个私人长片,其中包含我想要显示的Feed的Twitter ID号。这是我目前使用的适用代码:
Twitter twitter;
List<Status> statuses = null;
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true)
.setOAuthConsumerKey( TWITTER_CONSUMER_KEY )
.setOAuthConsumerSecret( TWITTER_CONSUMER_SECRET )
.setOAuthAccessToken( TWITTER_AUTH_TOKEN )
.setOAuthAccessTokenSecret( TWITTER_AUTH_TOKEN_SECRET );
try {
TwitterFactory tf = new TwitterFactory(cb.build());
twitter = tf.getInstance();
twitter.setOAuthConsumer( TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET );
statuses = twitter.getUserTimeline( TWITTER_ZOO_ID );
}
catch( TwitterException e ) {
Log.e( "TwitterListFragment", "Twitter Exception" );
return;
}
for( Status status : statuses )
mAdapter.add( status );
如果有人使用Twitter4J链接到Twitter 1.1的好例子,或者可以提供如何获得这些状态的示例,我真的很感激。我目前正在使用Android Studio,并在MavenCentral的Gradle中包含Twitter4J。
谢谢!
编辑:
进一步阅读后,我添加了这些额外的代码但没有成功:
twitter.setOAuthConsumer( TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET );
AccessToken token = new AccessToken( TWITTER_AUTH_TOKEN, TWITTER_AUTH_TOKEN_SECRET );
twitter.setOAuthAccessToken( token );
答案 0 :(得分:1)
如果您想从公共Twitter时间线获取信息,可以使用Application-only Authentication,因为用户无需登录,我认为它适合您,因为您不使用管理员权限。
仅限应用程序的身份验证流程遵循以下步骤:
应用程序将其消费者密钥和密钥编码为特殊密钥 编码的凭证集。
应用程序向POST发出请求 oauth2 / token端点,用于为承载令牌交换这些凭证。
访问REST API时,应用程序使用承载令牌进行身份验证。
由于twitter4j最近添加了此功能,您应该使用最后一个snapshot library。
使用它的一个例子:
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线程中执行此操作以避免网络异常f.i.使用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);
blog(西班牙文...)
中的完整说明 中的完整示例希望它有所帮助!
答案 1 :(得分:0)
我建议使用最近更新的Twitter SDK(Fabric)。