Я столкнулся с проблемой, когда пытаюсь отправить чириканье (фиксированное сообщение) из моего приложения для Android. Я пробовал это с 4 различными примерами кода (все из них с помощью twitter4j), взятыми с разных форумов, но всегда получал тот же результат: я добавляю свой пароль и пароль, аутентификация работает нормально, но после этого я всегда перенаправлен к URL-адресу, указанному в "callback_url" (я тестировал с существующими URL-адресами и не существую), а твит не публикуется. Как вы можете видеть, я выделил методы аутентификации и отправки твита, но как только аутентификация завершена, элемент управления никогда не возвращается в мое приложение. Я использую android 2.1 (тоже тестировался с 2.2). Любая помощь будет действительно оценена. Заранее спасибо.
public void onCreate(Bundle savedInstanceState) {
mTwitter = new TwitterFactory().getInstance();
mTwitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
if (mPrefs.contains(PREF_ACCESS_TOKEN)) {
loginAuthorisedUser();
} else {
loginNewUser();
}
}
private void loginNewUser() {
try {
mReqToken = mTwitter.getOAuthRequestToken(CALLBACK_URL);
WebView twitterSite = new WebView(this);
twitterSite.loadUrl(mReqToken.getAuthenticationURL());
setContentView(twitterSite);
} catch (TwitterException e) {
Toast.makeText(this, "Twitter Login error, try again later", Toast.LENGTH_SHORT).show();
}
}
private void loginAuthorisedUser() {
String token = mPrefs.getString(PREF_ACCESS_TOKEN, null);
String secret = mPrefs.getString(PREF_ACCESS_TOKEN_SECRET, null);
// Create the twitter access token from the credentials we got previously
AccessToken at = new AccessToken(token, secret);
mTwitter.setOAuthAccessToken(at);
Toast.makeText(this, "Welcome back", Toast.LENGTH_SHORT).show();
buttonTweet(null);
}
/**
* Catch when Twitter redirects back to our {@link CALLBACK_URL}</br>
* We use onNewIntent as in our manifest we have singleInstance="true" if we did not the
* getOAuthAccessToken() call would fail
*/
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
dealWithTwitterResponse(intent);
}
/**
* Twitter has sent us back into our app</br>
* Within the intent it set back we have a 'key' we can use to authenticate the user
*
* @param intent
*/
private void dealWithTwitterResponse(Intent intent) {
Uri uri = intent.getData();
if (uri != null && uri.toString().startsWith(CALLBACK_URL)) { // If the user has just logged in
String oauthVerifier = uri.getQueryParameter("oauth_verifier");
authoriseNewUser(oauthVerifier);
}
}
/**
* Create an access token for this new user</br>
* Fill out the Twitter4j helper</br>
* And save these credentials so we can log the user straight in next time
*
* @param oauthVerifier
*/
private void authoriseNewUser(String oauthVerifier) {
try {
AccessToken at = mTwitter.getOAuthAccessToken(mReqToken, oauthVerifier);
mTwitter.setOAuthAccessToken(at);
saveAccessToken(at);
// Set the content view back after we changed to a webview
// setContentView(R.layout.main);
tweetMessage();
} catch (TwitterException e) {
Toast.makeText(this, "Twitter auth error x01, try again later", Toast.LENGTH_SHORT).show();
}
}
private void tweetMessage() {
try {
mTwitter.updateStatus("Test - Tweeting");
Toast.makeText(this, "Tweet Successful!", Toast.LENGTH_SHORT).show();
} catch (TwitterException e) {
Toast.makeText(this, "Tweet error, try again later", Toast.LENGTH_SHORT).show();
}
}
private void saveAccessToken(AccessToken at) {
String token = at.getToken();
String secret = at.getTokenSecret();
Editor editor = mPrefs.edit();
editor.putString(PREF_ACCESS_TOKEN, token);
editor.putString(PREF_ACCESS_TOKEN_SECRET, secret);
editor.commit();
}
Декларация активности в AndroidManifest:
<activity android:name=".share.twitter.TwitterActivity" android:launchMode="singleInstance">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http://www.someurl.com" />
</intent-filter>
</activity>
Схема и хост в вашем приложении для Android должны быть чем-то уникальным для приложения, чтобы андроид знал, какое приложение должно обрабатывать обратный вызов. Теперь у вас есть андроид, и ваше приложение может обрабатывать веб-браузер с помощью схемы "http". Ознакомьтесь с ответами на этот пост. В частности, frankenstein описывает, как настроить схему и хосты, и мой код покажет вам, как обращаться с onResume().
Ниже приведена ссылка на однофайльное решение, в котором объясняется, как интегрировать твиты изображений и текста в приложение для Android.
Я только что справился с этим и вместо того, чтобы попытаться исправить ваш код, попробуйте использовать предоставленный код. Он должен работать без изменений и может отправлять твит с одним вызовом функции tweet().