Android开发中如何获取/下载任意网站的favicon图标
Android(Java)开发场景下获取任意网站favicon的实现方案
不需要接入第三方付费服务,在Android Studio的Java项目里可以通过两层逻辑实现输入URL自动抓取对应网站图标,覆盖绝大多数站点场景。
核心实现逻辑
站点favicon的存放规则只有两类,组合使用即可覆盖95%以上的网站:
- 默认路径兜底:几乎所有建站框架都会默认在域名根目录放置
favicon.ico文件,直接拼接根路径即可访问 - 源码解析匹配:部分站点会自定义图标路径、格式、尺寸,会在网页HTML的head区域通过link标签声明图标地址,抓取源码解析即可拿到真实路径
具体实现步骤
1. 声明必要权限
在项目的AndroidManifest.xml中添加网络权限,否则无法发起请求拉取图标和网页源码:
<uses-permission android:name="android.permission.INTERNET" />
如果项目需要兼容Android 9.0及以上版本的http明文请求,额外配置networkSecurityConfig允许对应域名的http访问即可。
2. 编写favicon地址获取工具类
两层逻辑依次执行,优先解析自定义图标,解析失败自动走默认路径兜底。
import java.net.MalformedURLException; import java.net.URL; import java.util.regex.Matcher; import java.util.regex.Pattern; public class FaviconUtils { /** * 从输入的任意网站URL,解析得到对应的favicon访问地址 * @param inputUrl 用户输入的网站URL * @param htmlContent 拉取到的对应网页的HTML源码,传null时直接返回默认路径 */ public static String getFaviconUrl(String inputUrl, String htmlContent) throws MalformedURLException { URL parsedUrl = new URL(inputUrl); String rootPath = parsedUrl.getProtocol() + "://" + parsedUrl.getHost(); // 传入了网页源码时,优先解析head里的自定义favicon配置 if (htmlContent != null && !htmlContent.isEmpty()) { // 兼容所有常见的favicon声明写法:shortcut icon、icon、apple-touch-icon Pattern faviconPattern = Pattern.compile( "<link[^>]+rel=[\"'](?:shortcut\\s+)?(?:icon|apple-touch-icon)[\"'][^>]+href=[\"']([^\"']+)[\"'][^>]*>", Pattern.CASE_INSENSITIVE ); Matcher matcher = faviconPattern.matcher(htmlContent); if (matcher.find()) { String iconPath = matcher.group(1); // 处理各种非绝对路径的写法 if (iconPath.startsWith("//")) { // 协议相对路径,补全当前访问协议 return parsedUrl.getProtocol() + ":" + iconPath; } else if (iconPath.startsWith("/")) { // 根目录相对路径,补全域名 return rootPath + iconPath; } else if (!iconPath.startsWith("http")) { // 层级相对路径,补全根路径 return rootPath + "/" + iconPath; } // 本身是完整绝对路径直接返回 return iconPath; } } // 解析失败兜底,返回根目录默认favicon地址 return rootPath + "/favicon.ico"; } }
3. 调用逻辑说明
- 所有网络请求(拉取网页源码、加载favicon图片)必须放在子线程执行,不要在主线程直接发起网络请求,否则会触发
NetworkOnMainThreadException崩溃 - 拿到favicon的合法URL后,直接用项目中已接入的图片加载框架(Glide、OkHttp拉流转Bitmap等)加载即可,不需要额外做特殊处理
- 如果解析得到的favicon地址加载失败,可以依次降级:优先加载解析到的多尺寸图标中尺寸最大的项,其次加载根目录的
favicon.ico,最后展示应用内预置的默认网页图标占位
常见坑点提示
- 不要忽略路径拼接逻辑:很多站点的favicon路径是相对路径,直接拿字符串去请求会报404
- 匹配标签的时候不要做大小写强校验,部分老站点的LINK标签、REL属性可能是大写写法,正则要开大小写忽略
- 部分站点的favicon是svg、png格式,不要默认认为所有图标都是ico后缀,图片加载框架会自动处理格式解析
- 不需要额外引入重量级的HTML解析库,简单场景下正则匹配的性能和准确率足够满足需求
内容的提问来源于stack exchange,提问作者TP SINGH
相关产品推荐
相关产品推荐

