前言
今天接到了一个需求,新版本提示的下载新版本希望唤醒本地浏览器,而不是由JCEF生成一个弹窗,leader说不好看......;
过程
1.GPT
代码具体如下
public class RequestHandler extends CefRequestHandlerAdapter {
private final String[] filterRequest = { "xxxx" };
@Override
public boolean onBeforeBrowse(CefBrowser browser, CefFrame frame, CefRequest request, boolean user_gesture, boolean is_redirect) {
String url = request.getURL();
try {
for (String target : filterRequest) {
if (url.equals(target)) {
if (Desktop.isDesktopSupported()) {
Desktop.getDesktop().browse(new URI(url));//唤醒系统默认浏览器
return true;
}
}
}
} catch (Exception e) {
return super.onBeforeBrowse(browser, frame, request, user_gesture, is_redirect);
}
return super.onBeforeBrowse(browser, frame, request, user_gesture, is_redirect);
}
}
结果显而易见,失败了;后面查看文档(文档地址:CEF3 Java API Docs)发现,这个handler并不是特别符号我的需求;
他是在导航之前进行处理,自我感觉时机晚了;
2.查文档
通过翻看文档中其他的handler,还真的找到了一个很符号我需求的handler(CefLifeSpanHandler)
查看详情
这不是正是我想要的吗;
修改代码
编写handlerAdapter:
public class LifeSpanHandler extends CefLifeSpanHandlerAdapter {
@Override
public boolean onBeforePopup(CefBrowser browser, CefFrame frame, String target_url, String target_frame_name) {
try {
if (BuildInfo.PRODUCT_HOME.equalsIgnoreCase(target_url)) {
Desktop.getDesktop().browse(new URI(target_url));
return true;
}
return false;
} catch (Exception e) {
return true;
}
}
}
将该handler注册到cefClient中:
//前面是一些业务代码,不太好展示
CefClient cefClient = cefApp.createClient();//创建cefClient实例
cefClient.addLifeSpanHandler(new LifeSpanHandler());//注册刚刚创建的那个handler