Android Twitter集成 - 卡在登录页面?

时间:2013-02-11 12:09:39

标签: android twitter android-webview android-twitter

我有一个以前的Android应用程序的代码,我成功地与Twitter集成。我已将此代码复制到新应用中,并为我的新应用更改了callback-urlconsumer-keyconsumer-secret

使用twitter4j库我可以获取我的RequestToken和身份验证网址,如下所示:

Twitter twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer(myConsumerKey, myConsumerSecret);
RequestToken requestToken = twitter.getOAuthRequestToken(myCallbackUrl);
String authenticationUrl = requestToken.getAuthenticationURL()

RequestToken具有非空token值,非空tokenSecret值和空secretKeySpec值。身份验证网址格式如下:

http://api.twitter.com/oauth/authenticate?oauth_token=...

我在我的WebView中加载了此网址,我看到以下页面:

Sign in page

我在这里被困住了。当我单击Sign In按钮时,只是同一页面继续加载。没有其他的。当我点击Cancel按钮时,我会看到以下页面:

enter image description here

当我点击Return to Fan League Beko BBL按钮时,仅在此页面上调用我的callback-url,其中denied参数的值为oauth_token。任何人之前都看过这样的事情,知道什么可能阻止我的签名请求被处理???

  

更新1:我已经尝试过桌面浏览器中的身份验证网址和Sign In按钮,它按预期工作,处理响应然后调用callback-url。在我的Android应用的WebView中尝试时,它只是失败了。我在多个Android设备和平板电脑上尝试过它。我的WebView也启用了JavaScript,所以不是这样。想法最受欢迎。我没有想法!

     

更新2 :我刚刚在WebView的{​​{1}}上完成了一些调试模式代码跟踪,当我点击{时,我看到了{1}}按钮,未调用WebViewClient方法,但调用以下三种方法(按顺序):Sign InshouldOverrideUrlLoading(WebView webView, String url)onPageStarted(WebView view, String url, Bitmap favicon)。这些方法的onLoadResource(WebView view, String url)值为:onPageFinished(WebView view, String url),即url参数已从验证网址中删除。也许这是https://api.twitter.com/oauth/authenticate请求被视为oauth_token请求,因此为什么同一页面会一直加载?我有什么想法可以正确处理这个POST按钮?

5 个答案:

答案 0 :(得分:2)

我猜你忘了从twitter app控制面板设置一个回调网址。

登录twitter api部分,选择您的应用并转到设置标签。

enter image description here

如果不这样做,当用户按下登录时,不会发生重定向,因此您将无法捕获验证者。

另一方面,当您设置回调网址时,您的网页视图可以拦截重定向。

注意:你可以设置你想要的任何url,重要的是捕获传递给重定向url的oauth_verifier参数。

在那种情况下你的

shouldOverrideUrlLoading

应该被触发。

答案 1 :(得分:1)

从WebViewClient覆盖onLoadResource(WebView view, String url)并在授权活动中使用此代码,您在onResume()中使用webView.loadUrl(authenticationUrl),在onCreate()中使用webView.setWebViewClient(webViewClient)

private WebViewClient webViewClient = new WebViewClient() {
    @Override
    public void onLoadResource(WebView view, String url) {
        // the URL we're looking for looks like this:
        // callbackurl?oauth_token=1234567890qwertyuiop
        Uri uri = Uri.parse(url);
        if (uri.getHost().equals("callbackurlhost")) {
            String token = uri.getQueryParameter("oauth_token");
            if (null != token) {
                webView.setVisibility(View.INVISIBLE);
                AccessToken accessToken = twitter.getOAuthAccessToken();
                // TODO store access token
                finish();
            } else {
                // TODO tell user to try again 
            }
        } else {
            super.onLoadResource(view, url);
        }
    }
};

答案 2 :(得分:1)

我最近在我的应用程序中集成了twitter。它工作得很好。

我使用过最新的twitter4j-core-3.0.3.jar

我创建了一个简单的演示应用程序,您可以从以下链接下载并进行操作。 http://santhoshkumaar.blogspot.in/2013/02/posting-message-on-twitter.html https://github.com/santhoshkumaar/ShareOnTwitter/

这可能对您有所帮助。

答案 3 :(得分:1)

奇怪的是,我的Twitter集成已经开始运作。我没有更改我的应用程序代码或我的应用程序的Twitter设置。我注意到,Twitter身份验证页面之前有一个蓝色的Sign In按钮,现在它有一个蓝色的Authenticate app按钮。所以我猜测Twitter上的某些内容已被修改/修复。

答案 4 :(得分:0)

你有没有把回调网址?

public static final String CALLBACK_URL =“twitterapp:// connect”;

检查你的授权方法:

mHttpOauthConsumer = new CommonsHttpOAuthConsumer(mConsumerKey, mSecretKey);
mHttpOauthprovider = new DefaultOAuthProvider("http://twitter.com/oauth/request_token",
                                                     "http://twitter.com/oauth/access_token",
                                                     "http://twitter.com/oauth/authorize");

public void authorize() 
{
        mProgressDlg.setMessage("Initializing ...");
        mProgressDlg.show();

        new Thread() {
            @Override
            public void run() {
                String authUrl = "";
                int what = 1;

                try {
                    authUrl = mHttpOauthprovider.retrieveRequestToken(mHttpOauthConsumer, CALLBACK_URL);    

                    what = 0;

                    Log.d(TAG, "Request token url " + authUrl);
                } catch (Exception e) {
                    Log.d(TAG, "Failed to get request token");

                    e.printStackTrace();
                }

                mHandler.sendMessage(mHandler.obtainMessage(what, 1, 0, authUrl));
            }
        }.start();
    }

拨打twitter.authorize(); 希望这有帮助