我正在使用 twitter4j 2.2.4 编写一个 Android Twitter 应用程序,但我无法通过 OAuth。
这是我的代码:
package info.mahmoudhossam.twitter;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.auth.AccessToken;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class TwitterActivity extends Activity {
private static int OAUTH_REQUEST = 1;
private static String consumerKey = "##########";
private static String consumerSecret = "################";
private Twitter twitter;
private AccessToken accessToken;
private TwitterBackend backend;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button loginButton = (Button) findViewById(R.id.button1);
registerForContextMenu(loginButton);
backend = new TwitterBackend();
twitter = backend.getTwitterInstance(consumerKey, consumerSecret);
}
public void onLogin(View view) {
Intent intent = new Intent("mahmoud.browser");
try {
Log.i("URL", backend.getRequestToken().getAuthenticationURL());
intent.putExtra("url", backend.getRequestToken().getAuthenticationURL());
} catch (TwitterException e) {
Log.e("Twitter", e.getMessage());
return;
}
startActivityForResult(intent, OAUTH_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == OAUTH_REQUEST && resultCode == RESULT_OK) {
Uri url = Uri.parse(data.getExtras().getString("url"));
String verifier = url.getQueryParameter("oauth_verifier");
Log.i("Verifier", verifier);
try {
accessToken = backend.getAccessToken(verifier);
} catch (TwitterException e) {
Log.e("Twitter", "Exception occurred, quitting");
return;
}
twitter.setOAuthAccessToken(accessToken);
try {
if(twitter.verifyCredentials() != null){
Toast.makeText(getApplicationContext(), "Logged in!", Toast.LENGTH_SHORT);
}
} catch (TwitterException e) {
Log.e("Twitter", e.getMessage());
}
} else if (resultCode == RESULT_CANCELED) {
Toast.makeText(this,
"Cannot connect to twitter, app not authorized",
Toast.LENGTH_SHORT).show();
}
}
}
还有 TwitterBackend 类:
package info.mahmoudhossam.twitter;
import java.util.List;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;
public class TwitterBackend {
private static Twitter twitter;
public Twitter getTwitterInstance(String consumerKey,
String consumerSecret){
if(twitter == null){
twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer(consumerKey, consumerSecret);
}
return twitter;
}
public RequestToken getRequestToken()
throws TwitterException {
return twitter.getOAuthRequestToken();
}
public AccessToken getAccessToken(String verifier)
throws TwitterException{
return twitter.getOAuthAccessToken(getRequestToken(), verifier);
}
public List<Status> getTimeline() throws TwitterException{
return twitter.getHomeTimeline();
}
public void updateStatus(String status) throws TwitterException{
twitter.updateStatus(status);
}
}
我从 Twitter 收到 401 错误,指出身份验证凭据丢失或不正确,我确定我输入了正确的消费者 key /密码。
代码本身有问题吗?
最佳答案
我意识到这是一个老问题,但我使用了您的 TwitterBackend
类,但我遇到了同样的问题。我通过做一个小改动解决了这个问题(不能说它为什么有效,你的应该没问题)。
改变这个
public AccessToken getAccessToken(String verifier) throws TwitterException{
return twitter.getOAuthAccessToken(getRequestToken(), verifier);
}
为此
public AccessToken getAccessToken(String verifier) throws TwitterException{
return twitter.getOAuthAccessToken(verifier);
}
我无法解释原因,但我只是开始查看 twitter4j 上列出的 getOAuthAccessToken() 的每个方法。并得到了一个有效的方法。
我希望这对某些人有所帮助,但感谢您提供了很好的基类。
关于android - 无法使用 twitter4j 授权我的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7387903/