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
相关产品推荐
相关产品推荐

