rokevin
移动
前端
语言
  • 基础

    • Linux
    • 实施
    • 版本构建
  • 应用

    • WEB服务器
    • 数据库
  • 资讯

    • 工具
    • 部署
开放平台
产品设计
  • 人工智能
  • 云计算
计算机
其它
GitHub
移动
前端
语言
  • 基础

    • Linux
    • 实施
    • 版本构建
  • 应用

    • WEB服务器
    • 数据库
  • 资讯

    • 工具
    • 部署
开放平台
产品设计
  • 人工智能
  • 云计算
计算机
其它
GitHub
  • WebView

WebView

JAVA JS 交互

Android本身自带方法

settings.setJavaScriptEnabled(true);

wvWeb.addJavascriptInterface(new CheckingDetailH5Activity.JsInterface(this), "android"); // android 是js中通过window

private class JsInterface {

    private Context mContext;

    public JsInterface(Context context) {
        this.mContext = context;
    }

    //在js中调用window.android.showInfoFromJs(name),便会触发此方法。
    @JavascriptInterface
    public void checkingUpdate() {

        EventBus.getDefault().post(new CheckingListRefreshEvent());
    }

    @JavascriptInterface
    public void checkingDetail(String lineCodeJs, String typeJs) {

       // todo something
    } 
}

JS中调用

windows.android.checkingUpdate()  
windows.android.checkingDetail(xx, xx);

可以传对象数组

https://github.com/pengwei1024/JsBridge

webView.loadData乱码解决

webView.getSettings().setDefaultTextEncodingName("UTF -8");//设置默认为utf-8  
webView.loadData(htmlData, "text/html", "UTF -8");//API提供的标准用法,无法解决乱码问题  
webView.loadData(htmlData, "text/html; charset=UTF-8", null);//这种写法可以正确解码 

设置cookie

/**
 * 将cookie同步到WebView
 * @param url WebView要加载的url
 * @param cookie 要同步的cookie
 * @return true 同步cookie成功,false同步cookie失败
 * @Author JPH
 */
public static boolean syncCookie(String url,String cookie) {

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        CookieSyncManager.createInstance(context);
    }
    
    CookieManager cookieManager = CookieManager.getInstance();
    cookieManager.setCookie(url, cookie);//如果没有特殊需求,这里只需要将session id以"key=value"形式作为cookie即可
    String newCookie = cookieManager.getCookie(url);
    return TextUtils.isEmpty(newCookie)?false:true;
}
// 设置cookie
public static void syncCookie(Context context) {
    CookieSyncManager.createInstance(context);  
    CookieManager cookieManager = CookieManager.getInstance();  
    cookieManager.setAcceptCookie(true);  
    cookieManager.removeSessionCookie();//移除  
    cookieManager.setCookie(url, cookies);//cookies是在HttpClient中获得的cookie  
    CookieSyncManager.getInstance().sync();  
} 

在android里面在调用webView.loadUrl(url)之前一句调用此方法就可以给WebView设置Cookie

注:这里一定要注意一点,在调用设置Cookie之后不能再设置

webView.getSettings().setBuiltInZoomControls(true);  
webView.getSettings().setJavaScriptEnabled(true);

web图片适配

没有转义的情况:

<html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0,minimum-scale=1.0"><style>img{max-width:80%;height:auto;}</style></head><body></body></html>

在string.xml文件中转义后的:

&lt;html&#160;lang=&quot;zh-CN&quot;&gt;&lt;head&gt;&lt;meta&#160;charset=&quot;UTF-8&quot;&gt;&lt;meta&#160;name=&quot;viewport&quot;&#160;content=&quot;width=width=device-width,&#160;user-scalable=no,&#160;initial-scale=1.0,&#160;maximum-scale=1.0,minimum-scale=1.0&quot;&gt;&lt;style&gt;img{max-width:80%%;height:auto;}&lt;/style&gt;&lt;/head&gt;&lt;body&gt;&lt;/body&gt;&lt;/html&gt;

如果服务器返回的没有样式就直接替换:

htmlData = htmlData.replace("<img", "<img style='max-width:90%;height:auto;'");

Android WebView的Js对象注入漏洞解决方案

https://blog.csdn.net/t12x3456/article/details/35269723

Android WebView通过js注入Html页面

通过执行js代码反向用资源id调用本地方法

wvWeb.addJavascriptInterface(new H5Activity.JsInterface(), "app");

private class JsInterface {

        public JsInterface() {
        }

        //在js中调用window.app.doBack(),便会触发此方法。
        @JavascriptInterface
        public void doBack() {

            finish();
        }
}
    
wvWeb.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
    
        }
    
        //转向错误时的处理
        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        
        }
    
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
    
            // 判断在某个页面
            if (url.contains("xxx.html")) {
    
                // android注入js
                wvWeb.loadUrl("javascript:function back(){window.app.doBack();}$(\".nav-arr\").on(\"click\",function(){back();})");
            }
        }
});

web view cookie

WebView中CookieManager会自动管理cookie不用手动添加

web view cookie 管理

https://blog.csdn.net/tscyds/article/details/75090245

Android 5.0及以上版本使用WebView不能存储第三方Cookies解决方案

Android 5.0以上的手机使用原生WebView浏览网页,在进行登录的时候会提示验证码错误,通过查找5.0以上系统的api文档,发现5.0以上版本的webview做了较大的改动,如:同步cookie的操作已经可以自动同步、但前提是我们必须开启第三方cookie的支持。

解决方法:cookieManager.setAcceptThirdPartyCookies(webview, true);

if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
        CookieManager.getInstance().setAcceptThirdPartyCookies(webView,true);

https://stackoverflow.com/questions/38672306/cookies-are-not-working-in-an-iframe-in-android-webview

java 调js 并获取返回值

@RequiresApi(api = Build.VERSION_CODES.KITKAT)
    public void back() {
        
        LogUtil.e(TAG, "back():=======");
        wvWeb.evaluateJavascript("javascript:canFinish()", new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String value) {
                if (value.equals("false")) {
                    isBackEnd = false;
                } else {
                    isBackEnd = true;
                }
            }
        });
    }
最近更新:: 2025/10/22 15:36
Contributors: luokaiwen