Не могу твитнуть с твиттером

1

Я столкнулся с проблемой, когда пытаюсь отправить чириканье (фиксированное сообщение) из моего приложения для 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>
Теги:
twitter-oauth
twitter4j

2 ответа

0
Лучший ответ

Схема и хост в вашем приложении для Android должны быть чем-то уникальным для приложения, чтобы андроид знал, какое приложение должно обрабатывать обратный вызов. Теперь у вас есть андроид, и ваше приложение может обрабатывать веб-браузер с помощью схемы "http". Ознакомьтесь с ответами на этот пост. В частности, frankenstein описывает, как настроить схему и хосты, и мой код покажет вам, как обращаться с onResume().

  • 0
    Привет @ jamn224, спасибо за ваш ответ, но я все еще не могу решить эту проблему. Я исправил манифест Android в соответствии с кодом Франкенштейна, также интегрировал предоставленный им пример (AndroidTwitterSample), добавил ваш код в onResume, но после аутентификации я никогда не возвращаюсь к своему коду, приложение всегда пытается перенаправить меня на URL обратного вызова После проверки изменений сообщение об ошибке, которое я увидел в моем эмуляторе, было «Веб-страница по адресу x-oauthflow-twitter: // {MY_CALLBACK_URL}? Oauth_token = xxxxx может быть временно недоступна или, возможно, она переместилась ...». У вас есть другие предложения?
  • 0
    Вы включили все теги в фильтр намерений? Похоже, вы забыли добавить android.intent.category.BROWSABLE и DEFAULT.
Показать ещё 3 комментария
0

Ниже приведена ссылка на однофайльное решение, в котором объясняется, как интегрировать твиты изображений и текста в приложение для Android.

Я только что справился с этим и вместо того, чтобы попытаться исправить ваш код, попробуйте использовать предоставленный код. Он должен работать без изменений и может отправлять твит с одним вызовом функции tweet().

  • 0
    Большое спасибо @MindSpiker, я проверю это

Ещё вопросы

Сообщество Overcoder
Наверх
Меню