# WebviewBrowser **Repository Path**: qincji/webview-browser ## Basic Information - **Project Name**: WebviewBrowser - **Description**: harmonyOS (鸿蒙)webview作为浏览器的常规使用。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 2 - **Created**: 2021-07-11 - **Last Updated**: 2024-05-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 1、config.json配置: ```json { //允许http访问 "deviceConfig": { "default": { "network": { "cleartextTraffic": true } } }, "module": { "abilities": [ { "orientation": "unspecified", //横竖屏切换后界面恢复 "configChanges": [ "orientation" ] } ], //添加网络访问权限 "reqPermissions": [ { "name": "ohos.permission.INTERNET" }, { "name": "ohos.permission.GET_NETWORK_INFO" }, { "name": "ohos.permission.ACCESS_NETWORK_STATE" }, { "name": "ohos.permission.DOWNLOAD_WITHOUT_NOTIFICATION" } ] } } ``` ### 2、横竖屏处理 ```java @Override protected void onOrientationChanged(AbilityInfo.DisplayOrientation displayOrientation) { Logs.i(TAG, "onOrientationChanged:" + displayOrientation.name()); //如果是横屏则请求全屏,竖屏恢复(估计自己的需求定) if (displayOrientation == AbilityInfo.DisplayOrientation.LANDSCAPE) { if (topBar != null) { topBar.hid(); getWindow().addFlags(WindowManager.LayoutConfig.MARK_FULL_SCREEN); } } else { if (topBar != null) { topBar.show(); getWindow().clearFlags(WindowManager.LayoutConfig.MARK_FULL_SCREEN); } } super.onOrientationChanged(displayOrientation); } ``` ### 3、常用的设置 ```java //https://developer.harmonyos.com/cn/docs/documentation/doc-references/webconfig-0000001138633149 WebConfig webConfig = webView.getWebConfig(); webConfig.setWebStoragePermit(true);//DOM Storage webConfig.setJavaScriptPermit(true);//启用js webConfig.setLoadsImagesPermit(true);//解决图片不显示 webConfig.setMediaAutoReplay(true); webConfig.setMediaAutoReplay(true); webConfig.setDataAbilityPermit(true); webConfig.setTextAutoSizing(true); webConfig.setSecurityMode(WebConfig.SECURITY_ALLOW); webConfig.setViewPortFitScreen(true); ``` ### 4、监听当前加载的url、数据、标题、进度、是否需要拦截处理等 ```java webView.setWebAgent(new WebAgent() { @Override public boolean isNeedLoadUrl(WebView webView, ResourceRequest request) { String scheme = request.getRequestUrl().getScheme(); Logs.d(TAG, "isNeedLoadUrl: " + scheme); if (scheme != null && (scheme.contains("alipay") || scheme.contains("mq") || scheme.contains("tencent") || scheme.contains("wechat") || scheme.contains("weixin") || scheme.contains("baidu") || scheme.contains("bilibili") || scheme.contains("new") || scheme.contains("orpheuswidget") || scheme.contains("yddict") || scheme.contains("ntesopen") || scheme.contains("12306") || scheme.contains("iosamap") || scheme.contains("weibo") || scheme.contains("youku") || scheme.contains("iqiyi") || scheme.contains("tudou") || scheme.contains("pptv") || scheme.contains("kugou") || scheme.contains("zhihu"))) { //还可以交给系统处理 //AppKit.openInBrowser(getAbility(), url); //return true; return false;//不进行拦截的Scheme } // 增加开发者自定义逻辑 return super.isNeedLoadUrl(webView, request); } @Override public void onLoadingPage(WebView webView, String url, PixelMap favicon) { super.onLoadingPage(webView, url, favicon); // 页面开始加载时自定义处理 progressBar.setVisibility(Component.VISIBLE); progressBar.setProgressValue(5); curUrl = url; } @Override public void onPageLoaded(WebView webView, String url) { super.onPageLoaded(webView, url); // 页面加载结束后自定义处理 progressBar.setVisibility(Component.HIDE); } @Override public void onLoadingContent(WebView webView, String url) { super.onLoadingContent(webView, url); // 加载资源时自定义处理 // webView.load(url); } @Override public void onError(WebView webView, ResourceRequest request, ResourceError error) { super.onError(webView, request, error); // 发生错误时自定义处理 Logs.e(TAG, "onError..." + error); } }); webView.setBrowserAgent(new BrowserAgent(this) { @Override public void onTitleUpdated(WebView webView, String title) { super.onTitleUpdated(webView, title); // 标题变更时自定义处理 if (isActiveTitle) { topBar.setTitle(title); } } @Override public void onProgressUpdated(WebView webView, int newProgress) { super.onProgressUpdated(webView, newProgress); // 加载进度变更时自定义处理 progressBar.setProgressValue(newProgress); if (newProgress == 100) {//加载结束 progressBar.setVisibility(Component.HIDE); } else { progressBar.setVisibility(Component.VISIBLE); } } }); ``` ### 5、控制前进后退 ```java Navigator navigator = webView.getNavigator(); if (navigator.canGoBack()) {//后退 navigator.goBack(); } if (navigator.canGoForward()) {//前进 navigator.goForward(); } ``` ### 6、给webview设置cookie ```java //上一次登录的cookie? JsonObject data = Hawk.get(HawkKey.COOKIE, null); if (data == null) { return; } String name = data.get("name").getAsString(); String value = data.get("value").getAsString(); CookieStore cookieStore = new MyCookieStore();//实现CookieStore cookieStore.setCrossDomainCookieEnable(webView, true); cookieStore.setCookieEnable(true); cookieStore.setCookie(name, value); ``` ### 7、JS调用原生接口,并且返回 ```java /** * 配置JS发来的消息处理。 * 如js中调用:var appResp = window.JsCallJava.call("{\"type\": \"is_login\"}"); * 其中,jsStr对应"{\"type\": \"is_login\"}" * appResp对应responseWeb(6002, "未登录") */ webView.addJsCallback("JsCallJava", jsStr -> { // 处理接收到的Js发送来的消息 Logs.d(TAG, "接收到前端的请求:" + jsStr); //处理web前端传递过来的数据 JsonObject req = new Gson().fromJson(jsStr, JsonObject.class); // JsonObject req = new JsonParser().parse(str).getAsJsonObject(); String type = req.get("type").getAsString(); Logs.d(TAG, "type:" + type); if ("set_cookie".equals(type)) { JsonObject data = req.getAsJsonObject("data"); String name = data.get("name").getAsString(); String value = data.get("value").getAsString(); if (name != null && value != null && !name.isEmpty() && !value.isEmpty()) { Hawk.put(HawkKey.COOKIE, data); Logs.d(TAG, "设置cookie成功:" + name + " | " + value); setCookies(); //登录成功之后,禁止返回到登录页? Dispatcher.getInstance().dispatch(new WebLoginEvent()); } else { return responseWeb(6001, "获取cookie数据异常"); } } else if ("is_login".equals(type)) { if (Hawk.contains(HawkKey.COOKIE)) { return responseWeb(200, "已登录"); } else { return responseWeb(6002, "未登录"); } } return responseWeb(200, "发送成功"); }); ```