Я испытываю некоторые проблемы, связанные с Twitter OAuth в рамках активности Android.Я прочитал много учебников и примеров кода, но все еще не могу получить токен доступа.
Каждый раз, когда я пытаюсь авторизоваться, я получаю это OAuthNotAuthorizedException:
oauth.signpost.exception.OAuthNotAuthorizedException: Authorization failed (server replied with a 401). This can happen if the consumer key was not correct or the signatures did not match.
Я много гуглил, и мне казалось, что я прочитал тысячи решений, но ни одно из них не сработало для меня.Надеюсь, вы можете помочь мне с этим (и я не беспокою вас тем же старым вопросом новичка!;))
Вот мой полный код активности:
package de.ownor.moremote;
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
import oauth.signpost.commonshttp.CommonsHttpOAuthProvider;
import twitter4j.Twitter;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
public class MakeTweet extends Activity {
public static final String CONSUMER_KEY = "Y0iYMkUgNX8kKgvDjzFgg";
public static final String CONSUMER_SECRET = "nuBZd8UGml5cjbm94Hf6dWOwIByrisZWpSnqODaUB5Q";
public static final String CALLBACK_URL = "de.ownor.moremote://twitter";
private static final String REQUEST_URL = "https://api.twitter.com/oauth/request_token";
private static final String ACCESS_TOKEN_URL = "https://api.twitter.com/oauth/access_token";
private static final String AUTH_URL = "https://api.twitter.com/oauth/authorize";
public static final String PREFS_NAME = "TwitterLogin";
public static final String TAG = "moremote - MakeTweet";
private Twitter twitter;
private CommonsHttpOAuthProvider provider;
private CommonsHttpOAuthConsumer consumer;
@Override
protected void onCreate(Bundle savedInstanceState) {
System.setProperty("http.keepAlive", "false");
super.onCreate(savedInstanceState);
setContentView(R.layout.make_tweet);
twitter = null;
if (!checkForSavedLogin()) {
askOAuth();
}
getConsumerProvider();
}
@Override
protected void onResume() {
super.onResume();
System.out.println("RESUMING!!");
if (this.getIntent() != null && this.getIntent().getData() != null) {
Uri uri = this.getIntent().getData();
if (uri != null && uri.toString().startsWith(CALLBACK_URL)) {
String verifier = uri
.getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER);
try {
// this will populate token and token_secret in consumer
// /////////////////////////////
// exception is thrown here! //
// /////////////////////////////
provider.retrieveAccessToken(consumer, verifier);
// Get Access Token and persist it
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);
((ApplicationEx) getApplication()).twitter = twitter;
} catch (Exception e) {
// Log.e(APP, e.getMessage());
e.printStackTrace();
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG)
.show();
}
}
}
}
private void askOAuth() {
try {
consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY,
CONSUMER_SECRET);
provider = new CommonsHttpOAuthProvider(REQUEST_URL,
ACCESS_TOKEN_URL, AUTH_URL);
provider.setOAuth10a(true);
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) {
Log.e(TAG, "Error in askOAuth");
e.printStackTrace();
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
private Boolean checkForSavedLogin() {
// Get Access Token and persist it
AccessToken a = getAccessToken();
if (a == null) {
Log.d(TAG, "No saved Login found");
return false;
}
// initialize Twitter4J
twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
twitter.setOAuthAccessToken(a);
((ApplicationEx) getApplication()).twitter = twitter;
return true;
}
private AccessToken getAccessToken() {
SharedPreferences settings = getSharedPreferences(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 storeAccessToken(AccessToken a) {
SharedPreferences settings = Preferences.getPreferences(this);
SharedPreferences.Editor editor = settings.edit();
editor.putString("accessTokenToken", a.getToken());
editor.putString("accessTokenSecret", a.getTokenSecret());
editor.commit();
}
private void getConsumerProvider() {
CommonsHttpOAuthProvider p = ((ApplicationEx) getApplication()).provider;
if (p != null) {
provider = p;
}
CommonsHttpOAuthConsumer c = ((ApplicationEx) getApplication()).consumer;
if (c != null) {
consumer = c;
}
}
private void setConsumerProvider() {
if (provider != null) {
((ApplicationEx) getApplication()).provider = provider;
}
if (consumer != null) {
((ApplicationEx) getApplication()).consumer = consumer;
}
}
}
Исключениебросается в метод onResume ().Я пометил точную линию.Я действительно надеюсь, что кто-нибудь может помочь мне здесь.Если вам нужна дополнительная информация, просто кричите!
Спасибо!
Симон.