I finally managed to get the OAuth running. Unless I don't know the exact error. I guess it was some issue with the consumer.
Here is my running code:
onCreate:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.twitter);
pref = Preferences.getPreferences(this);
consumer = new CommonsHttpOAuthConsumer(Key.TW_CONSUMER_KEY,
Key.TW_CONSUMER_SECRET);
provider = new CommonsHttpOAuthProvider(Key.TW_REQUEST_TOKEN_URL,
Key.TW_ACCESS_TOKEN_URL, Key.TW_AUTHORIZE_URL);
provider.setOAuth10a(true);
[...]
if (getIntent().getData() == null) {
checkForSavedLogin();
}
}
onResume:
protected void onResume() {
super.onResume();
Uri uri = getIntent().getData();
if (uri != null
&& Key.TW_CALLBACK_URI.getScheme().equals(uri.getScheme())) {
String token = pref.getString(Key.TW_REQUEST_TOKEN, null);
String secret = pref.getString(Key.TW_REQUEST_SECRET, null);
try {
if (!(token == null || secret == null)) {
consumer.setTokenWithSecret(token, secret);
}
String otoken = uri.getQueryParameter(OAuth.OAUTH_TOKEN);
String verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER);
Assert.assertEquals(otoken, consumer.getToken());
provider.retrieveAccessToken(consumer, verifier);
token = consumer.getToken();
secret = consumer.getTokenSecret();
saveAuthInformation(token, secret);
// Delete request information
saveRequestInformation(null, null);
if (!(token == null || secret == null)) {
Log.d(TAG, "Twitter login found!");
consumer.setTokenWithSecret(token, secret);
twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer(Key.TW_CONSUMER_KEY,
Key.TW_CONSUMER_SECRET);
twitter.setOAuthAccessToken(new AccessToken(token, secret));
}
} catch (Exception e) {
Log.d(TAG, "Couldn't receive token" + e.getMessage());
e.printStackTrace();
}
}
[...]
}
other methods:
private void checkForSavedLogin() {
if (pref.contains(Key.TW_USER_TOKEN)
&& pref.contains(Key.TW_USER_SECRET)) {
token = pref.getString(Key.TW_USER_TOKEN, null);
secret = pref.getString(Key.TW_USER_SECRET, null);
if (!(token == null || secret == null)) {
Log.d(TAG, "Twitter login found!");
consumer.setTokenWithSecret(token, secret);
twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer(Key.TW_CONSUMER_KEY,
Key.TW_CONSUMER_SECRET);
twitter.setOAuthAccessToken(new AccessToken(token, secret));
}
} else {
Log.d(TAG, "No Twitter login saved - asking for OAuth");
askOAuth();
}
}
private void askOAuth() {
try {
String authUrl = provider.retrieveRequestToken(consumer,
Key.TW_CALLBACK_URI.toString());
saveRequestInformation(consumer.getToken(),
consumer.getTokenSecret());
Toast.makeText(this, "Please authorize this app!",
Toast.LENGTH_LONG).show();
this.startActivity(new Intent(Intent.ACTION_VIEW, Uri
.parse(authUrl)));
} catch (OAuthException e) {
e.printStackTrace();
}
}
private void saveRequestInformation(String token, String secret) {
// null means to clear the old values
SharedPreferences.Editor editor = pref.edit();
if (token == null) {
editor.remove(Key.TW_REQUEST_TOKEN);
} else {
editor.putString(Key.TW_REQUEST_TOKEN, token);
}
if (secret == null) {
editor.remove(Key.TW_REQUEST_SECRET);
} else {
editor.putString(Key.TW_REQUEST_SECRET, secret);
}
editor.commit();
}
private void saveAuthInformation(String token, String secret) {
pref = Preferences.getPreferences(this);
Editor editor = pref.edit();
editor.putString(Key.TW_USER_TOKEN, token);
editor.putString(Key.TW_USER_SECRET, secret);
editor.commit();
}
Feel free to use this code... :)