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

Android WebView在Vimeo页面加载本地资源遇权限错误求助

解决WebView中远程页面加载本地Assets图片的问题

问题原因

你遇到的两个错误本质是同一类安全限制:

  1. WebView的安全机制禁止远程网页直接访问file://协议的本地资源,避免跨域风险;
  2. Vimeo页面的**内容安全策略(CSP)**仅允许加载https:/data:/blob:等协议的资源,file://不在许可范围内,因此被拦截。

你已经配置了WebView AssetLoader,但JavaScript中仍使用file:///android_asset路径,没有利用AssetLoader提供的虚拟HTTP代理机制。

解决方案

WebView AssetLoader的核心是通过虚拟HTTP/HTTPS URL代理本地Assets资源,让远程网页可以合法加载。默认情况下,AssetLoader使用https://appassets.androidplatform.net作为代理域名,只需修改JavaScript中的图片路径为该虚拟URL即可。

修改后的代码

  1. 更新JavaScript脚本的图片路径:
val vimeoScript = "javascript:(function () { " +
        "    let v = document.querySelector('.clip_wrapper');" +
        "    let img = document.createElement(\"img\");" +
        "    img.style.width = \"50px\";" +
        "    img.style.height = \"50px\";" +
        "    // 用AssetLoader虚拟URL替代file协议路径" +
        "    img.src = \"https://appassets.androidplatform.net/assets/downloader.png\";" +
        "    img.style.backgroundColor = \"black\";" +
        "    if(v.lastChild.nodeName != \"IMG\"){" +
        "       v.append(img);" +
        "   }" +
        "})()"
  1. 保留现有AssetLoader配置:
private val assetLoader = WebViewAssetLoader.Builder()
    .addPathHandler("/assets/", WebViewAssetLoader.AssetsPathHandler(this))
    .build()
  1. 确认WebViewClient拦截逻辑:
    你已实现的shouldInterceptRequest方法会自动将虚拟URL请求转发给AssetLoader,映射到本地assets/downloader.png资源,无需修改。

额外说明

  • 若需自定义代理域名,可在AssetLoader构建时调用setDomain(),但需在AndroidManifest.xml中配置对应的asset_statements;
  • 保持WebView的mixedContentMode为MIXED_CONTENT_ALWAYS_ALLOW,确保HTTPS页面能正常加载虚拟URL资源。

内容的提问来源于stack exchange,提问作者Ahmad Idrees

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:24:27