带有自定义协议的Android WebView

时间:2015-01-19 20:52:23

标签: android webview

我在WebView中实现用户身份验证时遇到问题。

正如API文档所说,我需要加载网址" http://example.com/?key=abc"然后用户输入他的登录信息&密码,然后他被重定向到网页" myapp:// token#access_token = 123456"。

我只需要在WebView中加载它并使用" 123456"返回我的应用程序。令牌。第一个问题是WebView不支持自定义协议,它给我一个错误" ERR_UNKNOWN_URL_SCHEME"

第二个问题是我不完全了解如何使用页面数据返回我的应用程序。

AndroidManifest.xml 中我有:

 <activity
        android:name="(appname)"
        android:label="@string/app_name"
        android:configChanges="orientation">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <category android:name="android.intent.category.BROWSABLE"/>
            <data
                android:scheme="myapp"
                android:host="token"/>
        </intent-filter>
    </activity>

Main.java 文件中,我有以下代码:

            Intent i = new Intent(Main.this, LoginWebViewActivity.class);
            startActivityForResult(i, 1);

并在 LoginWebActivity.java 中,我有以下代码:

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.webviewact);
        webView = (WebView) findViewById(R.id.webView);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.loadUrl("http://example.com/?key=abc");
    }

我看到一个快速解决方案:在外部浏览器中打开此链接,但是,我不明白我的应用程序如何从外部浏览器获取数据。

2 个答案:

答案 0 :(得分:1)

您不需要实现自定义方案。您应该将该回调URL传递到网页中,然后通过处理shouldOverrideUrlLoading来查找并拦截代码中的回调:

    webView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (url.startsWith("http://myapp/token#access_token=")) {
                // Parse the token fom the URL and close the webview
                return true;
            } else {
                return super.shouldOverrideUrlLoading(view, url);
            }
        }
    });

答案 1 :(得分:0)

这不是“网页”:

myapp://token#access_token=123456

这可能是一个URI,如果你正确地执行它,你可以过滤它。您需要使用IntentFilter实现自己的URI,如下所示:

                                             

看到这篇文章:

How to implement my very own URI scheme on Android

编辑:

要解释 - 您正在发送“登录”请求。然后你说你正在“重定向”客户端

myapp://token#access_token=123456

您无法告诉客户“重定向”到非URL网页。 WebView客户端是“http”客户端 - 它不接受它无法识别的数据方案/ mime类型。所以你的“重定向”失败了。

执行页面请求时,响应应该是URI而不是重定向。您可以解析响应数据以查看是否获得此响应(与登录失败相比),如果您这样做,则可以启动新的活动。就这么简单。

这里有一个答案建议您覆盖shouldOverrideUrlLoading,这也是可以接受的。在这种情况下,我们假设您正在进行客户端重定向,在这种情况下,此方法将允许您捕获身份验证响应,为您需要的数据解析它,然后您可以启动您想要的任何URL或活动

为了进一步解释,XML数据方案仅对Intent有用。您的WebView正在内部响应 - 没有意图发送。您必须获取HTTP响应,解析它,然后广播Intent以使您的代码部分能够正常工作。