2013-02-11 319 views
3

我有一个以前的Android应用程序的代码,我已经成功与Twitter整合。我已将此代码复制到一个新应用程序中,并为我的新应用程序更改callback-url,consumer-keyconsumer-secretAndroid Twitter集成 - 卡在登录页面?

使用twitter4j库,我能得到我的RequestToken和验证网址如下:

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=... 

我在WebView加载这个网址,我看到以下页面:

Sign in page

这里我卡住了。当我点击Sign In按钮时,只是同一页面不断加载。没有其他的。当我点击Cancel按钮但是,我看到如下页面:仅此页上

enter image description here

当我点击Return to Fan League Beko BBL按钮是我callback-url调用,与有我oauth_token它的价值denied参数。任何人之前看过类似的东西,并知道什么可能会阻止我的登录请求被处理?

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

更新2:我只是做了一些调试模式代码跟踪我WebViewWebViewClient,我看到,当我点击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按钮按下处理正确?

+0

希望这会帮助你http://stackoverflow.com/questions/1782743/twitter-integration-on-android-app/12417449#12417449 – Cjames 2013-02-14 03:59:11

回答

1

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

2

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

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

enter image description here

如果不这样做,当用户按下登录没有重定向会发生这样的话你将无法赶上验证。

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

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

在这种情况下,你的

shouldOverrideUrlLoading 

应该被触发。

+0

我仔细检查,肯定有一个回调URL指定。当我点击'取消'和'返回粉丝联盟Beko BBL'按钮时,回调URL被调用(带有'denied'参数)。 – 2013-02-23 16:09:02

1

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

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); 
     } 
    } 
}; 
+0

当我点击'Sign In'按钮时,传入'onLoadResource(WebView视图,String url)'方法的'url'值是'https:// api.twitter.com/oauth/authenticate'(没有' oauth_token'参数),而不是我的回调URL。 – 2013-02-23 16:58:33

+0

实际上,您的回调URL将在登录后被调用,并被重定向,并在onLoadResource()中发生此事件时会通知您。还要确保在Twitter网站上注册新应用程序时,应用程序类型是浏览器而不是客户端。 – 2013-02-23 21:31:40

0

你把这个回调url吗?

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(); 希望这可以帮助

+0

我已经指定了一个回调URL。这不是问题。 – 2013-02-23 16:15:10

1

我最近在我的应用程序的推特上已经整合了共享。它的工作完美。

我已经使用最新twitter4j核-3.0.3.jar

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

这可能对您有所帮助。

+0

什么是'twitter4j-media-support-3.0.3'罐子? – 2013-02-23 16:20:08

+0

twitter4j-media-support-3.0.3用于上传图片等多媒体支持的jar。您可以忽略它。 – Santhosh 2013-02-25 08:28:52

+0

thanqqqqq sooooo muchhhhhhh – Ramz 2013-06-21 05:15:03