我有一个以前的Android应用程序的代码,我成功地与Twitter集成。我已将此代码复制到新应用中,并为我的新应用更改了callback-url
,consumer-key
和consumer-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
按钮时,只是同一页面继续加载。没有其他的。当我点击Cancel
按钮时,我会看到以下页面:
当我点击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 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
请求,因此为什么同一页面会一直加载?我有什么想法可以正确处理这个POST
按钮?
答案 0 :(得分:2)
我猜你忘了从twitter app控制面板设置一个回调网址。
登录twitter api部分,选择您的应用并转到设置标签。
如果不这样做,当用户按下登录时,不会发生重定向,因此您将无法捕获验证者。
另一方面,当您设置回调网址时,您的网页视图可以拦截重定向。
注意:你可以设置你想要的任何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(); 希望这有帮助