uni-app 在uts中加入webview导致闪退,报错信息为 inflating class android.webkit.WebView
uni-app 在uts中加入webview导致闪退,报错信息为 inflating class android.webkit.WebView
产品分类
uniapp/App
开发环境、版本号及项目创建方式
项⽬目信息 | 详细信息 |
---|---|
PC开发环境操作系统 | Mac |
PC开发环境操作系统版本号 | 15.1 |
手机系统 | Android |
手机系统版本号 | Android 7.1.1 |
手机厂商 | 商米收银机 |
手机机型 | S2CC |
页面类型 | nvue |
vue版本 | vue3 |
打包方式 | 云端 |
项目创建方式 | CLI |
CLI版本号 | 3.0.0-4030620241128001 |
示例代码
index.uts
// index.uts
import Presentation from "android.app.Presentation";
import Display from "android.view.Display";
import Context from "android.content.Context";
import Bundle from "android.os.Bundle";
import R from 'io.dcloud.uni_modules.uts_sunmi_client.R';
class WebPresentation extends Presentation {
constructor(outerContext : Context, display : Display, url : string) {
super(outerContext, display)
}
override onCreate(savedInstanceState ?: Bundle) {
super.onCreate(savedInstanceState);
//自设布局
setContentView(R.layout.main_activity);
}
}
// 获取第二块屏幕
export function getPresentationDisplays() : Display | null {
const context = UTSAndroid.getAppContext();
if (context === null) {
return null
}
const mDisplayManager = context.getSystemService(Context.DISPLAY_SERVICE) as DisplayManager;
const displays = mDisplayManager.getDisplays()
const displayList = Array.fromNative(displays)
for (let i = 0; i < displayList.length; i = i + 1) {
const display = displayList[i] as Display;
console.log("屏幕" + displayList[i] as Display)
if(i==1){
return display
}
}
return null;
}
export function showTextDisplay(url : string) : IRes {
const activity = UTSAndroid.getUniActivity();
if (activity === null) {
return { code: 400, msg: 'activity is null' }
}
const presentationDisplay = getPresentationDisplays()
if (presentationDisplay != null) {
const textDisplay = new WebPresentation(activity, presentationDisplay, url);
textDisplay.show();
return { code: 0, msg: 'success' }
}
return { code: 200, msg: '没有副屏' }
}
main_activity.xml
// res/layout/main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal"
android:layout_width="match_parent" android:layout_height="match_parent">
<WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent" />
</LinearLayout>
index.nvue
// index.nvue
onMounted(() => {
showTextDisplay('http://www.baidu.com')
});
操作步骤
运行代码
预期结果
副屏展示网页
实际结果
软件闪退
bug描述
希望在副屏上加载一个网页,运行到setContentView(R.layout.main_activity);
的时候软件就会闪退,看日志报错 reportJSException >>> exception function:createInstanceContext, exception:white screen cause create instanceContext failed,check js stack ->Uncaught Error: targetMethod error::android.view.InflateException: Binary XML file line #4: Binary XML file line #4: Error inflating class android.webkit.WebView
,试了模拟器和真机都会出现这个问题
这个报错是说 xml 标签中的webview 标签不能正确加载。
Uncaught Error: targetMethod error::android.view.InflateException: Binary XML file line #4: Binary XML file line #4: Error inflating class android.webkit.WebView,
你先确保你的布局文件在原生环境中可以正常使用
试过了在原生环境是没问题的,用uts实现就会出现这个问题,图放评论里了
原生布局可以打开
提供一下可以复现问题的最简示例
在uni-app中集成WebView组件时遇到闪退问题,并伴随报错信息“inflating class android.webkit.WebView”,这通常指示了在Android原生层面对WebView组件的处理存在问题。这种情况可能由多种原因引起,包括但不限于WebView组件未正确初始化、AndroidManifest.xml中缺少必要的权限、或者WebView版本与Android系统版本不兼容等。
以下是一个基本的检查和修复步骤,包括如何在uni-app项目中配置WebView,并尝试解决可能的闪退问题。请注意,由于无法直接访问你的项目代码和环境,以下示例代码将基于通用实践和假设。
1. 确保AndroidManifest.xml配置正确
首先,确保你的AndroidManifest.xml
文件中已经添加了访问网络的权限,因为WebView需要网络访问:
<uses-permission android:name="android.permission.INTERNET" />
2. 在uni-app中使用WebView组件
在uni-app的页面中,你可以使用<web-view>
组件来嵌入网页。确保组件的使用方式正确:
<template>
<view>
<web-view src="https://www.example.com"></web-view>
</view>
</template>
<script>
export default {
data() {
return {};
}
}
</script>
<style>
/* 样式根据需要调整 */
</style>
3. 检查原生Android代码
如果问题依旧存在,可能需要检查uni-app编译生成的Android原生代码。特别是Activity
或Fragment
中WebView的初始化代码。以下是一个简单的原生Android WebView初始化示例:
WebView webView = findViewById(R.id.webview);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webView.loadUrl("https://www.example.com");
确保在相应的布局文件(如activity_main.xml
)中定义了WebView:
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
4. 调试和日志
使用Android Studio运行你的应用,并通过Logcat查看详细的崩溃日志。这可能会提供更多关于闪退原因的线索。
结论
由于uni-app封装了大部分原生细节,直接操作原生代码的情况较少,但理解WebView在原生层的工作机制对于解决问题至关重要。如果上述步骤未能解决问题,可能需要考虑WebView组件的兼容性问题,或者检查是否有其他库或插件与WebView冲突。