WebView Twitter OAuth回调不起作用

时间:2014-02-23 05:35:47

标签: android multithreading twitter oauth webview

我一直在使用一个教程来制作一个基本的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

1 个答案:

答案 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";