实战WebView加载js界面并播放视频遇到的一些小问题java.lang.IllegalStateException

本文介绍如何配置WebView以支持JavaScript,并确保正确加载样式文件。此外,还解决了WebView加载视频时仅播放声音的问题,通过调整AndroidManifest.xml和启用硬件加速来实现。文中还提供了避免WebView尺寸超出限制错误的方法。

直接上代码:

webView加载js界面

String contentHtml = "<html lang=\"en\">\n" +
        "                      <head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n" +
        "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n" +
        "<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0,viewport-fit=cover\">\n" +
        "<meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n" +
        "<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n" +
        "<meta name=\"format-detection\" content=\"telephone=no\">" +
        "<link rel=\"stylesheet\" href=\"file:///android_asset/css.css\" type=\"text/css\" /> " +
        "<script src =  \"file:///android_asset/news_js.js\"></script>                  </head><body id=\"activity-detail\" class=\"zh_CN reward_skin_primary mm_appmsg  appmsg_skin_default \">\n" +
        "<div id=\"js_article\" class=\"rich_media\">\n" +
        "<div class=\"rich_media_inner\">\n" +
        "<div id=\"page-content\" class=\"rich_media_area_primary\">\n" +
        "                                <div class=\"rich_media_content \" lang== \"en\" id=\"js_content\">\n" +
        homeListBean.informationContent+
        "</div>\n" +
        "</div>\n" +
        "</div>\n" +
        "</div>\n" +
        "</body>\t</html>";
//支持javascript
webView.getSettings().setJavaScriptEnabled(true);
// 设置可以支持缩放
webView.getSettings().setSupportZoom(true);
// 设置出现缩放工具
webView.getSettings().setBuiltInZoomControls(true);
//扩大比例的缩放
webView.getSettings().setUseWideViewPort(true);
//自适应屏幕
webView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
webView.getSettings().setLoadWithOverviewMode(true);
//设置格式
webView.getSettings().setDefaultTextEncodingName("utf-8");
//设置不硬件加速
webView.setLayerType(View.LAYER_TYPE_NONE, null);
webView.loadDataWithBaseURL(null,contentHtml, "text/html", "utf-8",null);

其中
"<link rel=\"stylesheet\" href=\"file:///android_asset/css.css\" type=\"text/css\" /> " +
"<script src =  \"file:///android_asset/news_js.js\"></script> 

是表示加载js的样式文件放在assets目录下:


webView加载视频的时候有很多设备只有声音,没有画面,这个时候在androidmanifest.xml中添加应用程序application中设置硬件渲染为true,在Oncreate函数中启用硬件渲染即可。

1、androidmanifest.xml文件设置如下属性:
android:hardwareAccelerated="true"

2、OnCreate中添加:
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

做网页视频只有声音没画面,一般这样可以解决。并不是所有机型都可以,也有特例,比较少。


java.lang.IllegalStateException: Unable to create layer for WebView, size 1080x18459 exceeds max size 8192

这个错误是由于webview在scrollview里设置成了wrap_content,导致webview不确定大小,而且webview启动了硬件加速,由于硬件加速是有个最小的缓存区域的,最终导致超过了缓存范围。
解决方法:
webView.setLayerType(View.LAYER_TYPE_NONE, null);
关闭硬件加速即可,也不能使用软件加速

<think>好的,我现在需要帮助用户解决小米设备上WebView长按时出现的java.lang.NoSuchFieldException: windowConfiguration报错问题。首先,我得仔细分析这个错误的可能原因。根据用户提供的引用内容,特别是引用[1]和[2],NoSuchFieldException通常是因为尝试访问的字段不存在。比如引用[2]中提到,当实体类字段名与数据库列名不一致时,通过反射获取字段就会失败,这提示我可能是反射调用的字段名称与实际类中的字段名不符。 接下来,我需要考虑这个错误发生在WebView的长按事件中。WebView内部可能使用了反射来访问某些系统类的字段,比如windowConfiguration。而小米设备可能修改了Android系统的部分代码,导致这个字段在特定版本或机型上不存在,从而引发异常。 根据引用[3],有时布局文件中的属性缺失也会导致异常,比如缺少宽度设置。不过这个问题似乎更可能与反射有关。所以,解决方案可能需要绕过或修复反射调用的部分。 可能的解决步骤包括: 1. 检查堆栈跟踪,确定异常发生的具体位置,是用户代码还是系统WebView的内部代码。 2. 如果是系统WebView问题,可能需要等待小米的更新,或者尝试更新WebView组件。 3. 使用try-catch块捕获异常,防止应用崩溃。 4. 通过反射检查字段是否存在,避免调用不存在的字段。 5. 查找是否有其他方法可以替代访问该字段的功能,避免依赖反射。 另外,参考引用[2]的解决方法,给数据库列起别名来匹配实体类字段,这启示我可能需要适配字段名或寻找替代方案。不过这里的问题是在系统类中,用户可能无法直接修改,所以需要其他方法,比如使用兼容性处理或反射前检查字段是否存在。 总结可能的解决方案:首先捕获异常避免崩溃,然后检查字段是否存在,如果不存在则寻找替代方法,或者更新相关组件。此外,联系小米官方反馈问题也可能有帮助。</think>### 解决方案:小米WebView长按报错`java.lang.NoSuchFieldException: windowConfiguration` #### 问题分析 该错误是由于小米设备系统WebView实现中,通过反射访问`windowConfiguration`字段时,发现目标类中不存在该字段。可能原因包括: 1. **系统版本差异**:小米定制系统修改了Android Framework代码,移除了某些字段[^1]。 2. **反射调用不兼容**:WebView内部依赖反射访问私有字段,但字段名或类结构在特定设备上已变更[^2]。 --- #### 解决步骤 1. **定位堆栈信息** - 检查Logcat输出的完整堆栈信息,确认是应用自身代码还是系统WebView内部触发的异常。 - 若属于系统WebView内部问题(如`com.android.webview.chromium`包),则需通过以下方式规避。 2. **全局异常捕获(临时规避)** ```java try { // WebView相关操作(如长按事件处理) } catch (NoSuchFieldException e) { Log.e("WebViewFix", "忽略缺失字段异常:" + e.getMessage()); } ``` 3. **动态反射兼容性适配** ```java // 检查字段是否存在后再调用 try { Class<?> clazz = Class.forName("android.view.WindowManager$LayoutParams"); Field field = clazz.getDeclaredField("windowConfiguration"); // 若存在,继续操作 } catch (Exception e) { // 使用替代方案或跳过 } ``` 4. **更新WebView组件** - 进入小米应用商店,搜索「Android System WebView更新至最新版本。 - 在代码中强制使用独立Chromium内核: ```xml <!-- AndroidManifest.xml --> <application android:usesCleartextTraffic="true" android:webViewImplementation="com.google.android.webview"> ``` 5. **反馈小米官方** - 通过小米社区或开发者支持渠道提交Bug报告,附上完整堆栈和机型信息。 --- #### 替代方案 若问题频繁出现且无法根治,可尝试以下方法: - **禁用长按菜单**: ```java webView.setOnLongClickListener(v -> true); // 拦截长按事件 ``` - **使用自定义WebView实现**: 继承WebView重写`performLongClick()`方法,覆盖默认行为。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值