You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebView打开谷歌地图短链接时URL被替换为intent://无法加载的问题咨询

解决WebView加载谷歌地图短链接时跳转为intent://的问题

我之前也碰到过一模一样的问题!谷歌地图分享的短链接(比如你用的https://maps.app.goo.gl/ei5DupR88SYBF8Am8)本质是App Link(深度链接),它的设计逻辑是优先唤起本地安装的谷歌地图App,只有当设备上没装这个App时,才会自动跳转到网页版地图。

但WebView默认的WebViewClient会直接解析这种intent://协议的链接,而WebView本身并不支持处理intent跳转,所以就出现了加载无效URL的情况。

下面给你两种靠谱的解决办法:

方法一:自定义WebViewClient拦截intent链接

通过重写shouldOverrideUrlLoading方法,手动处理intent协议的链接:要么唤起对应的App(如果有的话),要么加载网页版的 fallback 地址。

val webView = findViewById<WebView>(R.id.webview)
val webSettings: WebSettings = webView.settings
webSettings.javaScriptEnabled = true

webView.webViewClient = object : WebViewClient() {
    override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
        request?.url?.toString()?.let { url ->
            if (url.startsWith("intent://")) {
                try {
                    // 解析intent链接
                    val intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME)
                    // 检查设备是否有能处理该intent的应用
                    if (intent.resolveActivity(packageManager) != null) {
                        startActivity(intent)
                        return true
                    } else {
                        // 没有对应App,提取网页版 fallback 地址并加载
                        intent.getStringExtra("browser_fallback_url")?.let { fallbackUrl ->
                            view?.loadUrl(fallbackUrl)
                            return true
                        }
                    }
                } catch (e: URISyntaxException) {
                    e.printStackTrace()
                }
            }
        }
        // 其他正常链接交给WebView默认处理
        return super.shouldOverrideUrlLoading(view, request)
    }
}

val url = "https://maps.app.goo.gl/ei5DupR88SYBF8Am8"
webView.loadUrl(url)

方法二:提前解析短链接的最终网页地址

先通过网络请求获取短链接重定向后的实际网页URL,再直接让WebView加载这个地址,跳过intent跳转的环节。这里用OkHttp做示例(记得先在项目里引入OkHttp依赖):

val webView = findViewById<WebView>(R.id.webview)
val webSettings: WebSettings = webView.settings
webSettings.javaScriptEnabled = true
webView.webViewClient = WebViewClient()

// 注意:网络请求必须在子线程执行
val originalUrl = "https://maps.app.goo.gl/ei5DupR88SYBF8Am8"
val client = OkHttpClient()
val request = Request.Builder()
    .url(originalUrl)
    .head() // 只请求头部,获取重定向信息,比GET更高效
    .build()

client.newCall(request).enqueue(object : Callback {
    override fun onFailure(call: Call, e: IOException) {
        e.printStackTrace()
        // 请求失败时, fallback 加载原短链接
        runOnUiThread { webView.loadUrl(originalUrl) }
    }

    override fun onResponse(call: Call, response: Response) {
        // 获取重定向后的最终网页地址
        val finalWebUrl = response.request.url.toString()
        runOnUiThread { webView.loadUrl(finalWebUrl) }
        response.close()
    }
})

小提醒

  • 如果用方法二,别忘了在AndroidManifest.xml里添加网络权限:<uses-permission android:name="android.permission.INTERNET" />
  • 谷歌地图网页版依赖JavaScript,所以webSettings.javaScriptEnabled = true这个配置不能丢。

内容的提问来源于stack exchange,提问作者Ivan Škugor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 15:42:34