Android 使用webView加载html页面

1、首先在布局xml里面指定WebView根节点

复制代码
  <WebView
        android:id="@+id/myWebView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

2、在.java的onCreate()里使用

复制代码
@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_three);

        //1. asset目录下的index.html文件
        String filePath = "file:///android_asset/html/index.html";
        //2.本地内存中的index.html文件
        // 获取文件夹路径
        String htmlPath = getExternalFilesDir("html").getPath();
        File htmlFile = new File(htmlPath);
        // 判断是否存在,不存在则创建
        if (htmlFile.exists()){
            htmlPath =  htmlFile.getPath()+File.separator+"index.html";
        }else {
            htmlFile.mkdirs();
            htmlPath =  htmlFile.getPath()+File.separator+"index.html";
        }
        // 地址
        String localFilePath = "file:///"+htmlPath;
        //3.指定的URL的html文件
        /**
         * 若是不显示,在AndroidManifest.xml中添加android:usesCleartextTraffic="true"
         * 并且设置网络权限
         */
        String urlPath = "https://www.baidu.com/";


        myWebView = findViewById(R.id.myWebView);
        WebSettings myWebSettings = myWebView.getSettings();
        // webView解决加载html页面空白问题
        myWebSettings.setJavaScriptEnabled(true);// 设置支持javascript
        myWebSettings.setUseWideViewPort(true);//将图片调整到适合webView大小
        myWebSettings.setLoadWithOverviewMode(true);//缩放至屏幕大小
        myWebSettings.setDomStorageEnabled(true);//设置DOM缓存,当H5网页使用localstorage时一定要设置
        myWebSettings.setCacheMode(android.webkit.WebSettings.LOAD_NO_CACHE);// 设置去缓存,防止加载的是上一次数据
        myWebSettings.setDatabaseEnabled(true);

        // 解决加载本地内存中报错 err_access_denied
        myWebSettings.setAllowFileAccess(true);
        myWebSettings.setAllowContentAccess(true);

        // 解决webView报错 Loading local files from file:// urls is not possible due browser security restrictions
        /**
        *  设置是否允许运行在一个file schema URL环境下的JavaScript访问来自其他任何来源的内容,
         * 包括其他file schema URLs。
         * 通过此API可以设置是否允许通过file url加载的Javascript可以访问其他的源,
         * 包括其他的文件和http,https等其他的源。与上面的类似,实现一个就可以。
         * webSetting.setAllowUniversalAccessFromFileURLs(true);
        * */
        myWebSettings.setAllowUniversalAccessFromFileURLs(true);
        /**
         * 设置是否允许运行在一个file schema URL环境下的JavaScript访问来自其他任何来源的内容,
         * 包括其他file schema URLs。
         * 通过此API可以设置是否允许通过file url加载的Javascript可以访问其他的源,
         * 包括其他的文件和http,https等其他的源。与上面的类似,实现一个就可以。
         */
        //myWebSettings.setAllowUniversalAccessFromFileURLs(true);


        //加载html
        if (filePath != null) {
            myWebView.loadUrl(urlPath);
        }


    }

3、创建assets目录(与res目录同一级别)

4、将要访问的*.html页面放置到assets目录即可

5、使用X5内核 腾讯SDK

地址: 腾讯浏览服务

下载sdk:腾讯浏览服务-SDK下载

放置在libs文件夹,引用

AS高版本:

复制代码
implementation(fileTree("libs"))

AS低版本:

复制代码
android{
    ...
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
}
 

dependencies{
    ...
    compile files('libs/tbs_sdk_thirdapp_v4.3.0.386_44286_sharewithdownloadwithfile_withoutGame_obfs_20230210_114429.jar')
}

AndroidManifest.xml配置权限

复制代码
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

 <application
        android:name=".activity.app.MyAplication"
        ***
/application>

Application.java设置初始化

复制代码
package com.example.yuanzhoulv.activity.app;;
import android.app.Application;
import com.tencent.smtt.sdk.QbSdk;

public class MyAplication extends Application {

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        //搜集本地tbs内核信息并上报服务器,服务器返回结果决定使用哪个内核。

        QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {

            @Override
            public void onViewInitFinished(boolean arg0) {
                // TODO Auto-generated method stub
                //x5內核初始化完成的回调,为true表示x5内核加载成功,否则表示x5内核加载失败,会自动切换到系统内核。
            }

            @Override
            public void onCoreInitFinished() {
                // TODO Auto-generated method stub
            }
        };
        //x5内核初始化接口
        QbSdk.initX5Environment(getApplicationContext(),  cb);
    }


}

使用:

*.xml

复制代码
  <com.tencent.smtt.sdk.WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

*.java

复制代码
        //1. asset目录下的index.html文件
        String filePath = "file:///android_asset/html/index.html";
        //2.本地内存中的index.html文件
        // 获取文件夹路径
        String htmlPath = getExternalFilesDir("html").getPath();
        File htmlFile = new File(htmlPath);
        // 判断是否存在,不存在则创建
        if (htmlFile.exists()){
            htmlPath =  htmlFile.getPath()+File.separator+"index.html";
        }else {
            htmlFile.mkdirs();
            htmlPath =  htmlFile.getPath()+File.separator+"index.html";
        }
        // 地址
        String localFilePath = "file:///"+htmlPath;
        //3.指定的URL的html文件
        /**
         * 若是不显示,在AndroidManifest.xml中添加android:usesCleartextTraffic="true"
         * 并且设置网络权限
         */
        String urlPath = "https://www.baidu.com/";




webView = findViewById(R.id.webView);
        com.tencent.smtt.sdk.WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);// 设置支持javascript
        webSettings.setUseWideViewPort(true);//将图片调整到适合webView大小
        webSettings.setLoadWithOverviewMode(true);//缩放至屏幕大小
        webSettings.setDomStorageEnabled(true);//设置DOM缓存,当H5网页使用localstorage时一定要设置
        webSettings.setCacheMode(android.webkit.WebSettings.LOAD_NO_CACHE);// 设置去缓存,防止加载的是上一次数据
        webSettings.setDatabaseEnabled(true);

        // 解决加载本地内存中报错 err_access_denied
        webSettings.setAllowFileAccess(true);
        webSettings.setAllowContentAccess(true);

        webSettings.setAllowUniversalAccessFromFileURLs(true);

        //加载html
        if (filePath != null) {
            webView.loadUrl(localFilePath);
        }
相关推荐
攀登的牵牛花几秒前
前端向架构突围系列 - 架构方法(二):UML前端建模的一般方法和工具
前端·前端框架·uml
代码猎人几秒前
Object.assign和扩展运算符是深拷贝还是浅拷贝,两者有什么区别
前端
秋天的一阵风2 分钟前
🎥解决前端 “复现难”:rrweb 录制回放从入门到精通
前端·javascript·开源
意法半导体STM322 分钟前
【文末送NUCLEO-G431RB】一文说明白STM32G4双Bank启动与升级 LAT1596
前端·数据库·stm32·单片机·嵌入式硬件·mcu·stm32开发
前端一课2 分钟前
分享:基于Next.js的企业级提示词AI平台
前端
小高0074 分钟前
🔥「从零到一」我用 Node BFF 手撸一个 Vue3 SSR 项目(附源码)
前端·javascript·vue.js
SailingCoder6 分钟前
AI 流式对话该怎么做?SSE、fetch、axios 一次讲清楚
前端·javascript·人工智能·ai·node.js
低调小一8 分钟前
Google A2UI 协议深度解析:AI 生成 UI 的机遇与实践(客户端视角,Android/iOS 都能落地)
android·人工智能·ui
2501_915918419 分钟前
iOS App的tcp、udp数据包抓取在实际开发中的使用方式
android·tcp/ip·ios·小程序·udp·uni-app·iphone