[已解决,但我愿意接受新建议......]
我正在使用twitter4j将Twitter整合到我的Android应用中
当我尝试使用Twitter进行授权时,我使用我的oauth令牌调用以下端点:
https://api.twitter.com/oauth/authenticate?oauth_token=MY_VALID_TOKEN
哪个应该将我重定向到:
MY-CALLBACK:///?oauth_token=***&oauth_verifier=***
但相反,它将我重定向到:
https://api.twitter.comMY-CALLBACK///?oauth_token=***&oauth_verifier=***
这显然不是一个有效的网址
(另外,:
缺失 - 应该是MY-CALLBACK:///...
)
请注意我正在使用WebView进行通话
我可以操纵这个字符串使一切正常,但必须有一个更好的方法...
我将回调网址传递给
getOAuthRequestToken("MY-CALLBACK:///");
已经使用
为我的活动设置了intent-filter <data android:scheme="x-oauthflow-twitter" />
此外,活动有android:launchMode="singleInstance"
我做错了什么?
[编辑:更多详情]
mTwitter = new TwitterFactory().getInstance();
mTwitter.setOAuthConsumer(Constants.TWITTER_CONSUMER_KEY, Constants.TWITTER_CONSUMER_SECRET);
twitterWebView = new WebView(ActivityTwitterAuthorize.this);
twitterWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith(Constants.TWITTER_CALLBACK_URL)) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
// HACKY PART!
// I added the following code to force it to work, but this is a dirty hack...
// String TWITTER_CALLBACK_INVALID_PREFIX = "https://api.twitter.comx-oauthflow-twitter///";
// TWITTER_CALLBACK_URL = "MY-CALLBACK:///";
// BEGIN
} else if (url.startsWith(TWITTER_CALLBACK_INVALID_PREFIX)) {
url = url.substring(TWITTER_CALLBACK_INVALID_PREFIX.length());
url = Constants.TWITTER_CALLBACK_URL + url;
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
// END
} else {
view.loadUrl(url);
}
return true;
}
});
mTwitterReqToken = mTwitter.getOAuthRequestToken(Constants.TWITTER_CALLBACK_URL);
twitterWebView.loadUrl(mTwitterReqToken.getAuthenticationURL());
没有hacky部分,此代码会导致“网页无法使用”错误,因为网址无效:
https://api.twitter.comMY-CALLBACK///?oauth_token=***&oauth_verifier=***
如果网址是MY-CALLBACK:///?oauth_token=***&oauth_verifier=***
,那么我的活动会收到一个意图,一切都会好的...
使用“hacky part”,我的代码可以工作,但我想避免使用那段代码。
答案 0 :(得分:3)
我发现在按照我在网上看到的指南后,我无法以这种方式工作。
我最终使用我自己的自定义WebViewClient
代码:
if ( url.contains( "MY-CALLBACK:///" ) )
{
final int start = url.indexOf( '?' ) + 1;
final String params = url.substring( start );
final String verifierToken = "oauth_verifier=";
if ( params.contains( verifierToken ) )
{
final int value = params.indexOf( verifierToken ) + verifierToken.length();
final String token = params.substring( value );
view.stopLoading();
authoriseNewUser( token );
}
else if ( params.contains( "denied" ) )
{
view.stopLoading();
finish();
}
}
else
{
view.loadUrl( url );
}
return true;
答案 1 :(得分:0)
使用CallBack_URI以下,它可能对您有帮助。
public static final String OAUTH_CALLBACK_SCHEME = "x-oauthflow-twitter";
public static final String OAUTH_CALLBACK_HOST = "callback";
public static final String CALLBACK_URL = OAUTH_CALLBACK_SCHEME + "://" + OAUTH_CALLBACK_HOST;
答案 2 :(得分:0)
public static final String OAUTH_CALLBACK_SCHEME = "x-oauthflow-twitter";
public static final String OAUTH_CALLBACK_HOST = "litestcalback";
public static final String OAUTH_CALLBACK_URL = OAUTH_CALLBACK_SCHEME+ "://" +OAUTH_CALLBACK_HOST;
在代码和清单文件中使用这种类型的callback_url ......
答案 3 :(得分:0)
我猜您的代码没有任何问题。我昨天得到了相同的结果,但今天它就像一个魅力。这可能是服务器方面的问题。你能再试一次你原来的(没有黑客部分)解决方案吗?请