【问题标题】:Custom url scheme in Android webViewAndroid webView中的自定义url方案
【发布时间】:2019-04-18 10:06:31
【问题描述】:

目前的状态是什么,您能否让 Android webView(不是浏览器/Chrome 自定义选项卡)解释带有自定义 url 方案的链接,例如“bankid:///?autostarttoken=xxxx-xxxxc&redirect=https://。 ..”

这里的预期行为是加载链接时应该打开 BankID 应用程序 - 改为获取“err_unknown_url_scheme”。有什么解决方法吗?或者是使用 Intent 的唯一方式?

尝试使用 Intent 如下,它可以工作,但是重定向参数 url 出现问题,这会打开不需要的浏览器。将其替换为 app id/null 以留在 webView/app 中,但随后无法在 webView 中获取预期的回调 url。

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {

        String url = request.getUrl().toString();
        if(!url.startsWith("http") && !url.startsWith("https")) {
            Uri newUri = replaceUriParameter(Uri.parse(url), 
            "redirect", BuildConfig.APPLICATION_ID);

            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_VIEW);
            intent.setData(newUri);

            startActivityForResult(intent, START_ACTIVITY_FOR_RESULT_LOGIN);
            view.reload();
            return true;
       }
}

【问题讨论】:

    标签: android-webview bankid


    【解决方案1】:

    这可能是一个迟到的答案,但它可能对其他人有所帮助。

    shouldOverrideUrlLoading 的方向正确 但是您只需要使用 Intent 就可以了,其余的都会得到处理。

    这是解决方案的 kotlin 版本。

    override fun shouldOverrideUrlLoading(
        view: WebView?,
        request: WebResourceRequest
    ): Boolean {
       val url = request.url.toString()
       if (url.isNotEmpty()) {
           if (URLUtil.isNetworkUrl(url)) {
                return false
           } else if (url.startsWith("bankid")){
                       val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
                      startActivity(intent)
                 }
                         
       }
       return true
    }
    

    【讨论】: