我一直在使用一个教程来制作一个基本的Twitter客户端,而我所要做的就是让OAuth工作。它将我带到同意页面,但在我点击“接受”后,它不会将我重定向回我的应用程序。这是我的代码:
Thread thread = new Thread(new Runnable(){
@Override
public void run() {
try {
requestToken = twitter
.getOAuthRequestToken(TWITTER_CALLBACK_URL);
Test.this.startActivity(new Intent(Intent.ACTION_VIEW, Uri
.parse(requestToken.getAuthenticationURL())));
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
我尝试更改TWITTER_CALLBACK_URL的值,但这没有帮助。我遵循了一个建议来制作WebView而不是启动浏览器,但这也没有用,因为我收到一条错误,说“必须在同一个线程上调用所有WebView方法”。
我尝试在UI线程中调用该方法,如下所示:
final WebView wv = (WebView) findViewById(R.id.wv);
mAppActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
try {
requestToken = twitter
.getOAuthRequestToken(TWITTER_CALLBACK_URL);
wv.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
wv.loadUrl(requestToken.getAuthorizationURL());
return true;
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
});
但是这导致了NetworkOnMainThreadException。我也尝试过实现Async任务,如下所示,但是当我点击调用这个片段的方法的按钮时,绝对没有任何反应,甚至没有例外:
private class LoadURLAsync extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
WebView wv = (WebView) findViewById(R.id.wv);
wv.loadUrl(urls[0]);
return null;
}
}
try {
// get the access token
mAppActivity.this.accessToken =
twitter.getOAuthAccessToken(
requestToken, verifier);
LoadURLAsync task = new LoadURLAsync();
task.execute(new String[] {requestToken.getAuthorizationURL()});
} catch (Exception e) {
e.printStackTrace();
}
我看了下面的答案,但是他们仍然无法弄清楚如何从浏览器返回应用程序,或者让WebView运行起来。如果有人能解决这些问题,那就太棒了,谢谢!
WebView Twitter login window on UI thread How to fix android.os.NetworkOnMainThreadException? OAuth + Twitter on Android: Callback fails
答案 0 :(得分:0)
显然,URL必须与清单中的android:host和android:scheme参数完全相同,组合在一起。例如:
<data
android:host="x-oauthflow-twitter"
android:scheme="callback" />
static final String TWITTER_CALLBACK_URL = "callback://x-oauthflow-twitter";