3

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

使用该twitter4j库,我可以获得我的RequestToken身份验证 URL,如下所示:

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

具有RequestToken非空token值、非空tokenSecret值和空secretKeySpec值。身份验证 url 的格式如下:

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

我在我的中加载了这个 url,WebView我看到了以下页面:

登录页面

我在这里卡住了。当我单击Sign In按钮时,只是同一页面不断加载。没有其他的。但是,当我单击该Cancel按钮时,我会看到以下页面:

在此处输入图像描述

只有在我单击Return to Fan League Beko BBL按钮时才会在此页面上callback-url调用我,并使用一个denied以 myoauth_token作为其值的参数。任何人以前都见过这样的事情并且知道什么可能会阻止我的登录请求被处理???

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

更新 2:我刚刚对我WebView的 's进行了一些调试模式代码跟踪,WebViewClient我看到当我单击Sign In按钮时,shouldOverrideUrlLoading(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参数已从认证 url 中剥离。也许这是一个POST被视为请求的GET请求,因此为什么同一页面不断加载?有什么想法可以Sign In正确处理此按钮按下吗?

4

5 回答 5

2

我猜你忘了从 twitter 应用程序控制面板设置回调 url。

登录 twitter api 部分,选择您的应用程序并转到设置选项卡。

在此处输入图像描述

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

另一方面,当您设置回调 url 时,您的 webview 可以拦截重定向。

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

在这种情况下,您的

shouldOverrideUrlLoading

应该被触发。

于 2013-02-14T22:29:02.230 回答
1

从 WebViewClient覆盖并在您在 onResume() 和onCreate() 中使用的onLoadResource(WebView view, String url)Authorization Activity 中使用此代码。webView.loadUrl(authenticationUrl)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);
        }
    }
};
于 2013-02-18T19:59:41.527 回答
1

我最近在我的应用程序中集成了 Twitter 上的共享。它工作完美。

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

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

这可能对您有帮助。

于 2013-02-20T07:29:37.000 回答
1

奇怪的是,我的 Twitter 集成已经开始工作了。我没有更改我的应用程序代码或应用程序的 Twitter 设置。我注意到 Twitter 身份验证页面以前有一个蓝色Sign In按钮,现在它有一个蓝色Authenticate app按钮。所以我猜在 Twitter 结束时有些东西被改变/修复了。

于 2013-03-12T15:09:12.367 回答
0

有没有放回调地址?

公共静态最终字符串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(); 希望这可以帮助

于 2013-02-19T07:39:11.597 回答