您好 在我的Android应用程序中,我可以在登录后立即拨打Twitter api。我正在使用相同的OAuthConsumer实例。但是当我为后续调用创建OAuthconsumer并使用setTokenWithSecret时,我得到错误的签名错误。
我花了几个小时尝试调试,但没有运气......感谢任何帮助。
以下是代码...在onnewIntent中,如果语句1 == 1有效但我得到错误的签名错误如果我在Twitter适配器上调用验证方法
private static String TAG = "OAuthForTwitter";
private CommonsHttpOAuthConsumer httpOauthConsumer;
private OAuthProvider httpOauthprovider;
public final static String consumerKey = "";
public final static String consumerSecret = "";
private final String CALLBACKURL = "myapp://mainactivity";
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.d(TAG, "onNewIntent");
Uri uri = intent.getData();
if (uri != null && uri.toString().startsWith(CALLBACKURL)) {
String verifier = uri
.getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER);
Log.d(TAG, "onNewIntent " + " verifier " + verifier);
try {
httpOauthprovider.retrieveAccessToken(httpOauthConsumer,
verifier);
String userKey = httpOauthConsumer.getToken();
String userSecret = httpOauthConsumer.getConsumerSecret();
if (1 == 1) {
String surl = "http://api.twitter.com/1/account/verify_credentials.xml";
HttpGet request = null;
HttpClient httpClient = null;
HttpResponse response = null;
request = new HttpGet(surl);
httpOauthConsumer.sign(request);
System.out.println("Sending request to Twitter...");
httpClient = new DefaultHttpClient();
response = httpClient.execute(request);
String sresponse = parseResponseToString(response);
Log.d(TAG, sresponse);
} else {
TwitterAdapter adapter = new TwitterAdapter(null,
consumerKey, consumerSecret, userKey, userSecret);
String s = adapter.VerifyUser();
Log.d(TAG, s);
}
} catch (Exception e) {
Log.d(TAG, "onNewIntent error " + e.getMessage());
}
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
doOauth();
}
private void doOauth() {
try {
httpOauthConsumer = new CommonsHttpOAuthConsumer(consumerKey,
consumerSecret);
httpOauthprovider = new DefaultOAuthProvider(
"http://twitter.com/oauth/request_token",
"http://twitter.com/oauth/access_token",
"http://twitter.com/oauth/authorize");
String authUrl = httpOauthprovider.retrieveRequestToken(
httpOauthConsumer, CALLBACKURL);
this.startActivity(new Intent(Intent.ACTION_VIEW, Uri
.parse(authUrl)));
Log.d(TAG, "sent doOauth");
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
}
Log.d(TAG, " doOauth Complete");
}
public class TwitterAdapter {
oauth.signpost.commonshttp.CommonsHttpOAuthConsumer httpOauthConsumer;
public TwitterAdapter(String username, String consumerkey,String consumersecret, String accesstoken, String accesssecret) {
httpOauthConsumer = new CommonsHttpOAuthConsumer(consumerkey, consumersecret);
httpOauthConsumer.setTokenWithSecret(accesstoken, consumersecret);
}
public String VerifyUser() throws ClientProtocolException, IOException,
OAuthMessageSignerException, OAuthExpectationFailedException,
OAuthCommunicationException {
String surl = "http://api.twitter.com/1/account/verify_credentials.xml";
HttpGet request = null;
HttpClient httpClient = null;
HttpResponse response = null;
request = new HttpGet(surl);
httpOauthConsumer.sign(request);
System.out.println("Sending request to Twitter...");
httpClient = new DefaultHttpClient();
response = httpClient.execute(request);
return parseResponseToString(response);
}
}
}
答案 0 :(得分:0)
您是否尝试过使用Scribe?
它有一个使用Twitter的working example,并且它已准备就绪。
答案 1 :(得分:0)
我尝试了你的代码......如果我按原样使用它,但是如果我改变它以适合我的应用程序它不起作用。我没有收到verify_credentials调用的响应。我一定错过了关于OAuth的一些事情。但这就是我正在做的事情
public class scribeauth extends Activity {
private static String TAG = "OAuthForTwitter";
public final static String consumerKey = "";
public final static String consumerSecret = "";
private final String CALLBACKURL = "myapp://mainactivity";
private static final String AUTHORIZE_URL = "https://twitter.com/oauth/authorize?oauth_token=";
private static final String PROTECTED_RESOURCE_URL = "http://api.twitter.com/1/account/verify_credentials.xml";
OAuthService service = null;
Token requestToken = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
doOauth();
}
private void doOauth() {
try {
service = new ServiceBuilder().provider(TwitterApi.class)
.apiKey(consumerKey)
.apiSecret(consumerSecret)
.callback(CALLBACKURL).build();
requestToken = service.getRequestToken();
this.startActivity(new Intent(Intent.ACTION_VIEW, Uri
.parse(AUTHORIZE_URL + requestToken.getToken())));
} catch (Exception e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
}
Log.d(TAG, " doOauth Complete");
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.d(TAG, "onNewIntent");
Uri uri = intent.getData();
if (uri != null && uri.toString().startsWith(CALLBACKURL)) {
String sverifier = uri
.getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER);
Verifier verifier = new Verifier(sverifier);
Token accessToken = service.getAccessToken(requestToken, verifier);
String secret = accessToken.getSecret();
String token = accessToken.getToken();
new TwitterAdapter().VerifyUser(consumerKey, consumerSecret, token, secret);
}
}
public class TwitterAdapter {
public String VerifyUser(String consumerkey, String consumersecret,
String accesstoken, String accesssecret) {
service = new ServiceBuilder().provider(TwitterApi.class)
.apiKey(consumerkey)
.apiSecret(consumersecret)
.callback(CALLBACKURL).build();
OAuthRequest request = new OAuthRequest(Verb.GET,PROTECTED_RESOURCE_URL);
Token accessToken = new Token(accesstoken, accesssecret);
service.signRequest(accessToken, request);
Response response = request.send();
String sresponse = response.getBody();
Log.d(TAG, sresponse);
return sresponse;
}
}
}
答案 2 :(得分:0)
刚试过linkedinexample.java并且无法传递第37行:Verifier verifier = new Verifier(in.nextLine());
应用程序停止了。我是唯一一个吗?