Обратный вызов Twitter4j OAuth успешен, но тестовый твит не удался - PullRequest
1 голос
/ 18 декабря 2011

Тяжелое время с OAuth в Twitter4j.До этого у меня была проблема, подробно описанная в # 3255153 и ошибка 401, но в конце концов она была устранена, и я столкнулся с более трудной задачей.

Страница авторизации приложения Twitter запускается вбраузер, я вхожу в систему и утверждаю приложение для моей учетной записи.Затем он перенаправляет обратно в приложение, и ничего не происходит.Представление точно такое же, как и до запуска страницы авторизации.

Чтобы увидеть, сработало ли это, я установил для Toast сообщение «Вход в Twitter успешное» в onResume или onNewIntent (показано ниже), которое никогда не появляется.Однако получен URL-адрес успешного обратного вызова, так как эта запись отображается в LogCat:

12-18 09:25:50.426: I/ActivityManager(186): Starting: Intent { act=android.intent.action.VIEW cat=[android.intent.category.BROWSABLE] dat=snapp://twitter?oauth_token=tokenhere&oauth_verifier=verifierhere cmp=com.infini_servers.snapp/.SnappActivity } from pid 7853

Вот мой onNewIntent (также есть виртуальный клон для onResume):

@Override
    protected void onNewIntent(Intent intent) 
    {
        super.onNewIntent(intent);        

        Uri uri = intent.getData();
        if (uri != null && uri.toString().startsWith(CALLBACKURL))
        {
            Toast.makeText(getBaseContext(), "Login to twitter successful!", Toast.LENGTH_LONG);
            String verifier = uri.getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER);
            try
            {
                provider.retrieveAccessToken(consumer, verifier); 

                AccessToken accessToken = new AccessToken(consumer.getToken(),
                        consumer.getTokenSecret());
                twitter.setOAuthConsumer(consumerKey, consumerSecret);
                twitter.setOAuthAccessToken(accessToken);
                String tweet = "Test";
                twitter.updateStatus(tweet);
                Toast.makeText(getBaseContext(), "Tweet Successful!", Toast.LENGTH_LONG);
            }
            catch (Exception e)
            {
                Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_LONG);
            }
        }       
    }

Исоответствующие биты моего манифеста:

 <activity
            android:label="@string/app_name"
            android:name=".SnappLaunch" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            </activity>
        <activity
            android:label="@string/app_name"
            android:name=".SnappActivity"
            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="snapp" android:host="twitter" /> 
            </intent-filter>
        </activity>

Ответы [ 3 ]

0 голосов
/ 16 января 2013

Toast.makeText(getBaseContext(), "Login to twitter successful!", Toast.LENGTH_LONG);

Не забудьте вызвать 'show ()', когда хотите сделать тост.

0 голосов
/ 21 апреля 2014

код вашего метода onResume (), помещенный внутрь asynctask.он работает нормально.

см. этот образец,

class TwitterLogin extends AsyncTask<String, String, String> 
    {

        @Override
        protected String doInBackground(String... params) 
        {
            // TODO Auto-generated method stub

            Uri uri = getIntent().getData();                
            if (uri != null && uri.toString().startsWith(TWITTER_CALLBACK_URL))
            {
                String verifier = uri.getQueryParameter(URL_TWITTER_OAUTH_VERIFIER);
                try 
                {
                    AccessToken accessToken = twitter.getOAuthAccessToken(requestToken, verifier);
                    // Shared Preferences
                    Editor e = loginPrefs.edit();
                    e.putString(PREF_KEY_OAUTH_TOKEN, accessToken.getToken());
                    e.putString(PREF_KEY_OAUTH_SECRET,accessToken.getTokenSecret());
                    e.putBoolean(PREF_KEY_TWITTER_LOGIN, true);
                    e.commit();

                    Log.e("Twitter OAuth Token", "> " + accessToken.getToken());


                    long userID = accessToken.getUserId();
                    User user = twitter.showUser(userID);
                    String username = user.getName();
                    Log.e("UserID: ", "userID: "+userID+""+username);

                    Log.v("Welcome:","Thanks:"+Html.fromHtml("<b>Welcome " + username + "</b>"));
                } 
                catch (Exception e) 
                {
                    Log.e("Twitter Login Error", "> " + e.getMessage());
                }
            }

            return null;
        }

        @Override
        protected void onPostExecute(String result) 
        {
            // TODO Auto-generated method stub
            super.onPostExecute(result);

        }

        @Override
        protected void onPreExecute() 
        {
            // TODO Auto-generated method stub
            super.onPreExecute();

        }
    }
0 голосов
/ 16 февраля 2012

Я недавно играл с Twitter4j, и у меня были некоторые проблемы, похожие на те, которые вы испытываете.Я не вижу ничего плохого в коде, который вы опубликовали, но мне интересно, что такое URL обратного вызова, который вы передаете getOauthRequestToken?У меня были некоторые проблемы с этим сам.Я думаю, что ваш CALLBACKURL должен быть установлен на "snapp: // twitter".Обратите внимание, что вам нужно двоеточие.

Если это не сработает, я предлагаю вам попробовать удалить android: host из строки манифеста:

<data android:scheme="snapp" android:host="twitter" />

, чтобы у вас осталось:

<data android:scheme="snapp" />

и затем в коде, в котором вы делаете вызов getOauthRequestToken, передайте значение "snapp: ///".Это было в основном то, что я сделал, чтобы сначала заставить его работать.

Если это потом сработает, вы можете попробовать поэкспериментировать с возвращением android: host = "twitter" и затем изменить значение, переданное getOauthRequestToken.

Если это не работает, вы видели, вызывается ли onNewIntent вообще - то есть он просто не проходит тест uri.toString (). StartWith (CALLBACKURL), поскольку ваш тост отображается только в том случае, если он прошел?Вы можете попробовать войти в систему или добавить точку останова в отладчике.

...