首页 > 其他分享 >Adnroid WebView从http协议加载本地html,而不是file协议

Adnroid WebView从http协议加载本地html,而不是file协议

时间:2024-01-19 15:56:18浏览次数:38  
标签:http assets wvSettings wv Adnroid html interceptedWebRequest file WebView

1.使用WebViewAssetLoader 需要在build.gradle中添加webkit
implementation 'androidx.webkit:webkit:1.6.0'

2.然后设置Webview
 protected void webviewSet() {
        WebView wv = binding.wv;
        WebSettings wvSettings = wv.getSettings();
        final WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
                .addPathHandler("/assets/", new WebViewAssetLoader.AssetsPathHandler(this.getContext()))
                .build();
        wvSettings.setJavaScriptEnabled(true);
        wvSettings.setAllowFileAccessFromFileURLs(false);
        wvSettings.setAllowUniversalAccessFromFileURLs(false);
        wvSettings.setAllowFileAccess(true);
        wvSettings.setAllowContentAccess(true);
        wvSettings.setDomStorageEnabled(true);

        wv.setWebViewClient(new WebViewClientCompat() {
            @Override
            @RequiresApi(21)
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                WebResourceResponse interceptedWebRequest = assetLoader.shouldInterceptRequest(request.getUrl());
                if (interceptedWebRequest != null) {
            // 在旧版本Android中会出现以下错误
            // Failed to load module script: The server responded with a non-JavaScript MIME type of "". 
            // 这里手动设置mime类型 if (request.getUrl().toString().endsWith(".js")) { interceptedWebRequest.setMimeType("text/javascript"); } } return interceptedWebRequest; } @Override @SuppressWarnings("deprecation") // for API < 21 public WebResourceResponse shouldInterceptRequest(WebView view, String url) { WebResourceResponse interceptedWebRequest = assetLoader.shouldInterceptRequest(Uri.parse(url)); if (interceptedWebRequest != null) { if (Uri.parse(url).toString().endsWith(".js")) { interceptedWebRequest.setMimeType("text/javascript"); } } return interceptedWebRequest; } }); // 暴露object对象暴露给Js, addJavascriptInterface,让js能够调用java对象的方法 AndroidForJS sdk = new AndroidForJS(this); wv.addJavascriptInterface(sdk, "android"); // Assets are hosted under http(s)://appassets.androidplatform.net/assets/... . // If the application's assets are in the "main/assets" folder this will read the file // from "main/assets/www/index.html" and load it as if it were hosted on: // https://appassets.androidplatform.net/assets/www/index.html
     // 本地的html文件存放在main/assets/index.html, 默认通过以下链接加载 wv.loadUrl("https://appassets.androidplatform.net/assets/index.html");
     // wv.loadUrl("file:///android_asset/index.html");
     // wv.loadUrl("http://www.baidu.com"); // 监听返回键,跳转回上一个url而不是关闭整个页面 wv.setOnKeyListener((view, i, event) -> { if (event.getAction() == KeyEvent.ACTION_DOWN) { if (i == KeyEvent.KEYCODE_BACK && wv.canGoBack()) {// mWebView.goBack(); wv.loadUrl("javascript:window.history.back(-1)"); return true; } } return false; }); }

 

3. 如果使用了vite,那么vite配置也可以更改以下

vite.config.ts文件

 1 export default defineConfig({
 2   // base: '/android_asset/',   // 用file协议加载,那么构建的url加上可以加上这个
 3   base: './',            // http协议加载,设置./
 4   plugins: [
 5     vue(),
 6     vueJsx(),
 7   ],
 8   resolve: {
 9     alias: {
10       '@': fileURLToPath(new URL('./src', import.meta.url))
11     }
12   },
13   build: {
14     outDir: '../assets/',   // 导出目录
15     emptyOutDir: true,
16     target: ['es2015', 'chrome58']    // 如果需要运行在比较旧的Webview上
17   }
18 })        

 


javascript - 在 Android 的 WebView 中放宽 MIME 类型检查?或者强制常规javascript的模块类型? - IT工具网 (coder.work)

标签:http,assets,wvSettings,wv,Adnroid,html,interceptedWebRequest,file,WebView
From: https://www.cnblogs.com/umbed/p/17974826

相关文章

  • android开发编译出错:Unable to find method ''org.gradle.api.file.RegularFileProper
    Unabletofindmethod''org.gradle.api.file.RegularFilePropertyorg.gradle.api.file.ProjectLayout.fileProperty(org.gradle.api.provider.Provider)'''org.gradle.api.file.RegularFilePropertyorg.gradle.api.file.ProjectLayout.fileProp......
  • HttpWebRequest -- 一个很坑的401 UnAuthorization的解决方法
    昨天,一个新的客户在CallRestfulAPI的时候,出现了401UnAuthorization的错误。查看解决方法,有下面几个原因会导致这个问题:检查 ServicePointManager.SecurityProtocol 设置,并设置 ServicePointManager.ServerCertificateValidationCallback 以至少返回 true(以接......
  • ELK之Filebeat自动断开问题解决
     自动断开命令 解决自动断开命令nohup./filebeat-e-cfilebeat.yml>./filebeat.log 2>&1& disown 其他的方式(目前我没有使用) 在linux操作系统/etc/systemd/system目录下创建一个filebeat.service文件,写入如下内容需要注意替换文件的位置以及版本[Unit]D......
  • SQL Server Profiler的trc文件生成阻止
    很奇葩,sqlserver自动生成trc文件,每分钟一个,重启服务器也没用。解决思路:查询现在正在跑的trace进程select*fromsys.fn_trace_getinfo(0);关闭C2审计功能EXECsp_configure'c2auditmode','0';重启数据库服务再次查看,已经没了。然后删除数据盘所有的trc文件。EXECsp_configure......
  • Nginx基础配置详解(main、events、http、server、location)
    Nginx基础配置详解(main、events、http、server、location):https://blog.csdn.net/weixin_43834401/article/details/130562289?ops_request_misc=&request_id=&biz_id=102&utm_term=nginx%20server%20%E7%9A%84%E6%A0%B9%E7%9B%AE%E5%BD%95&utm_medium=distribute.pc_......
  • 2-STM32F103+EC800K(移远4G Cat1)远程升级篇(自建物联网平台)-STM32通过EC800K使用htt
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ZLIOTB/EC800K/myota.html"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>  说明前......
  • cudnn.h: No such file or directory
    详解cudnn.h:Nosuchfileordirectory当我们在使用CUDA进行GPU编程时,有时可能会遇到以下错误信息:cudnn.h:Nosuchfileordirectory。本文将详细介绍这个错误的原因以及如何解决这个问题。错误原因该错误表明编译器无法找到cudnn.h文件,即CUDA深度神经网络库(cuDNN)的头文件。c......
  • Android 配置https抓包
    在Android中抓包常用fidder或者Charles,http可以直接抓去到请求信息,https抓取不到下面介绍两种抓包方案,可以轻松的获取请求的信息。一、使用用户证书1、application中android:networkSecurityConfig="@xml/network_security_config"android:usesCleartextTraffic="true"2......
  • Makefile 使用 shell 命令
    转发自https://www.cnblogs.com/phillee/p/15020046.html0.前言前面一节我们学习了make的基本使用规则以及变量定义赋值方法,可以写一些简单的实例。Makefile学习笔记之变量定义与赋值target...:prerequisites...command......在使用make进行开发的过程中,我们常......
  • spring boot 3.2.1 dremio jdbc jprofiler 集成
    jprofiler可以直接与idea集成,对于分析一些实际需要debug但是不好复现的问题还是比较方便的,以下是一个简单的与dremio集成的,springboot使用了3.2(jdk需要17)同时也会包含一些启动说明安装idea插件直接plugins的市场中搜索安装就可以了,之后就是配置了idea启动配置因......