【问题标题】:Twitter4j OAuth callback succeeds, but test tweet failsTwitter4j OAuth 回调成功,但测试推文失败
【发布时间】:2012-01-23 01:18:15
【问题描述】:

在 Twitter4j 中使用 OAuth 时遇到了困难。在此之前,我遇到了#3255153 中详述的问题和一个 401 错误,但最终解决了这些问题,并且遇到了一个更难解决的问题。

Twitter 应用程序授权页面在浏览器中启动,我登录并批准我的帐户的应用程序。然后它重定向回应用程序,没有任何反应。该视图与启动授权页面之前完全相同。

为了查看它是否有效,我在 onResume 或 onNewIntent(如下所示)中设置了 Toast 一条消息说“登录到 Twitter 成功”,该消息永远不会弹出。但是,会收到成功的回调 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>

【问题讨论】:

  • 我遇到了同样的问题。您找到解决问题的方法了吗?

标签: android oauth twitter-oauth twitter4j


【解决方案1】:

您的 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();

        }
    }

【讨论】:

    【解决方案2】:

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

    当你想敬酒时不要忘记调用'show()'。

    【讨论】:

      【解决方案3】:

      我最近一直在玩 Twitter4j,并且遇到了一些听起来与您遇到的问题相似的问题。我在您发布的代码中看不到任何错误,但我想知道您传递给 getOauthRequestToken 的回调 URL 是什么?我自己对此有一些问题。我认为您的 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().startsWith(CALLBACKURL) 测试,因为你的 toast 只有在通过时才会显示?您可以尝试在调试器中输入一些日志或添加断点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-24
        • 1970-01-01
        • 2016-09-05
        • 1970-01-01
        • 2015-05-15
        • 2019-09-06
        • 1970-01-01
        • 2020-03-16
        相关资源
        最近更新 更多