Я создаю клиент Twitter на платформе Android
С этим кодом я продолжаю получать OAuthNotAuthorizedException, что в соответствии с документацией означает «поставщик услуг отклонил потребителя»
Это исключение происходит в методе retrieveAccessToken (), поэтому он уже получил токен запроса от метода retrieveRequestToken (), то есть обратный вызов работает.
Я неправильно выполняю настройку OAuth?
package com.android.bufftweet;
imports ...
public class Auth extends Activity {
private final static String CONSUMER_KEY = "...";
private final static String CONSUMER_SECRET = "...";
private final static String CALLBACK_URL = "bufftweet://auth";
private OAuthProvider provider;
private CommonsHttpOAuthConsumer consumer;
private Bundle authBundle;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//init oauth
consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
consumer.setMessageSigner(new HmacSha1MessageSigner());
provider = new CommonsHttpOAuthProvider(
"http://twitter.com/oauth/request_token",
"http://twitter.com/oauth/access_token",
"http://twitter.com/oauth/authorize");
String authUrl;
try {
authUrl = provider.retrieveRequestToken(consumer, CALLBACK_URL);
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl)));
} catch (OAuthMessageSignerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OAuthNotAuthorizedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OAuthExpectationFailedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OAuthCommunicationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onResume() {
super.onResume();
authBundle = new Bundle();
Uri uri = this.getIntent().getData();
if (uri != null && uri.toString().startsWith(CALLBACK_URL)) {
String verifier = uri.getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER);
// this will populate token and token_secret in consumer
try {
provider.retrieveAccessToken(consumer, verifier); }
catch (OAuthMessageSignerException e) {
e.printStackTrace();
} catch (OAuthNotAuthorizedException e) {
e.printStackTrace();
} catch (OAuthExpectationFailedException e) {
e.printStackTrace();
} catch (OAuthCommunicationException e) {
e.printStackTrace();
}
authBundle.putString("TOKEN",consumer.getToken());
authBundle.putString("TOKEN_SECRET", consumer.getTokenSecret());
authBundle.putString("CONSUMER_KEY", CONSUMER_KEY);
authBundle.putString("CONSUMER_SECRET", CONSUMER_SECRET);
Intent goToTweetHome = new Intent(Auth.this, TweetHome.class);
goToTweetHome.putExtra("authBundle", authBundle);
startActivity(goToTweetHome);
}
}
}
Вот как выглядит мой манифест для справки
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.bufftweet"
android:versionCode="1"
android:versionName="1.0">
<uses-permission android:name="android.permission.INTERNET" />
<application android:icon="@drawable/ic_buff" android:label="@string/app_name">
<activity android:name=".BuffTweet"
android:label="@string/app_name"
android:windowSoftInputMode="stateVisible|adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Auth">
<intent-filter>
<action android:name="android.intent.action.VIEW"></action>
<category android:name="android.intent.category.DEFAULT"></category>
<category android:name="android.intent.category.BROWSABLE"></category>
<data android:scheme="bufftweet" android:host="auth"></data>
</intent-filter>
</activity>
<activity android:name=".TweetHome">
</activity>
</application>
<uses-sdk android:minSdkVersion="7" />
</manifest>