Android WebView 使用本地字体-WebViewAssetLoader

看看项目是否有WebViewAssetLoader类,如果找不到,需要导包。

复制代码
implementation 'androidx.webkit:webkit:1.15.0'

WebViewAssetLoader使用

复制代码
val assetLoader = WebViewAssetLoader.Builder()
    .addPathHandler("/assets/", WebViewAssetLoader.AssetsPathHandler(mContext))
    .addPathHandler("/res/", WebViewAssetLoader.ResourcesPathHandler(mContext))
    .build()

2行addPathHandler看需要添加,字体在res目录,就要用ResourcesPathHandler;字体在assets目录,就要用AssetsPathHandler。

Web网页的 CSS 中使用 appassets.androidplatform.net 协议来引用本地字体

复制代码
@font-face {
    font-family: 'Inter-SemiBold';
    src: url('https://appassets.androidplatform.net/assets/fonts/Inter-SemiBold.otf') format('opentype');
}

协议 https://appassets.androidplatform.net/

当你使用 WebViewAssetLoader 处理本地资源时,协议(URL)会自动映射为 https://appassets.androidplatform.net/,这是 Android 在 WebView 中为本地资源提供的一个特殊 URL。

因此,你 不需要修改 域名部分,保持为 https://appassets.androidplatform.net/,而本地资源的路径会根据你在 WebViewAssetLoader 中设置的路径来进行映射。

如何配置资源路径

复制代码
https://appassets.androidplatform.net/assets/fonts/Inter-SemiBold.otf

当请求以 /assets/ 开头的路径时,它应该从 assets 文件夹中加载文件。需要注意的是,AssetsPathHandler 用来处理 assets/ 文件夹下的资源。

上面路径处理assets目录下的fonts/Inter-SemiBold.otf的字体。

复制代码
https://appassets.androidplatform.net/res/fonts/Inter-SemiBold.otf

当请求以 /res/ 开头的路径时,它应该从 resources 文件夹中加载文件。需要注意的是,ResourcesPathHandler 用来处理 res/ 文件夹下的资源。

同理,该路径处理res目录下的fonts/Inter-SemiBold.otf的字体。

设置 WebViewClient

复制代码
webView.webViewClient = object : WebViewClient() {
    // 项目中字体放在res/font/XXX.otf路径,所以用ResourcesPathHandler
    val assetLoader = WebViewAssetLoader.Builder()
        .addPathHandler("/res/", WebViewAssetLoader.ResourcesPathHandler(mContext))
        .build()

    override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest): WebResourceResponse? {
        return interceptFontRequest(request.url) ?: super.shouldInterceptRequest(view, request)
    }

    // web使用本地字体
    private fun interceptFontRequest(uri: Uri): WebResourceResponse? {
        val url = uri.toString()
        if (url.endsWith(".ttf") || url.endsWith(".otf")) {
            try {
                val response = assetLoader.shouldInterceptRequest(uri)
                // 必加,不加可能不生效。
                response?.responseHeaders = mapOf("Access-Control-Allow-Origin" to "*")
                return response
            } catch (e: Exception) {
                LogUtils.e(e)
            }
        }
        return null
    }
}

web网页的css使用:

复制代码
https://appassets.androidplatform.net/res/font/xxx.otf
相关推荐
拥小抱12 分钟前
Compose 知识点
android
文章永久免费只为良心12 分钟前
Web应用安全与防护_第三章_日志文件包含_从一道 CTFshow 题目讲透「日志投毒型 LFI → RCE」:原理、时序陷阱与全变种攻防手册
android·网络安全·渗透测试·漏洞危害·漏洞描述·日志投毒·红队指南
AIsoft_868940 分钟前
学术讲座录音如何整理?录音APP可行吗
android·iphone
Patrick在香港3 小时前
一个斜杠,把毫秒变成十几秒
android·数据库·python·性能优化·正则表达式·回溯·redos
海雅达手持终端PDA4 小时前
工业手持终端的“去手机化”演进:看海雅达如何以“同轴扫摄”终结工程妥协,重塑工业PDA新范式
android·物联网·智能手机·硬件工程·能源·制造·iot
booboosui5 小时前
删掉一个住在本机的 agent:8 处要清,顺序不能反
android
hcgeng6 小时前
Android获取崩溃日志
android
aqi006 小时前
AI编程让鸿蒙开发电子书APP更加快捷
android·华为·harmonyos·鸿蒙·harmony
GY-936 小时前
【Android】Android Studio 中的协程
android