uni-app 在uts中加入webview导致闪退,报错信息为 inflating class android.webkit.WebView

发布于 1周前 作者 wuwangju 来自 uni-app

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,试了模拟器和真机都会出现这个问题


5 回复

这个报错是说 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原生代码。特别是ActivityFragment中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冲突。

回到顶部