Android WebView url问题

img


如图,我在url后添加了一个参数,在手机或者电脑浏览器上运行都没有问题

img


放入webview之后就无法正常使用

<uses-permission android:name="android.permission.INTERNET"/>


        val webSettings = webview.settings
        with(webSettings) {
            javaScriptEnabled = true //支持 JS
            javaScriptCanOpenWindowsAutomatically = true //支持通过 JS 打开新窗口

            domStorageEnabled = true //支持 DOM Storage
            defaultTextEncodingName = "utf-8" //设置编码格式
            loadsImagesAutomatically = true //支持自动加载图片

            setSupportZoom(true) //支持缩放,默认为 true。是下面属性的前提
            builtInZoomControls = true //设置内置的缩放控件,若为 false,则该 WebView 不可缩放
            displayZoomControls = true //隐藏原生的缩放控件

            databaseEnabled = true //数据库存储 API 是否可用
            cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK //设置缓存,只要本地有就使用缓存中的数据,本地没有才从网络上获取
            allowFileAccess = true //设置可以访问文件

            //下面两者合用,可设置自适应屏幕
            useWideViewPort = true //将图片调整到适合 WebView 的大小
            loadWithOverviewMode = true //缩放至屏幕大小
        }
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/247841
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:android WebView在系统应用里的报错问题
  • 除此之外, 这篇博客: Android webview缓存机制中的 三、缓存机制 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • Android WebView自带的缓存机制有5种:

    1、浏览器 缓存机制

    根据 HTTP 协议头里的 Cache-Control(或 Expires)和 Last-Modified(或 Etag)等字段来控制文件缓存的机制。

    例如Last-Modified:标识文件在服务器上的最新更新时间

    下次请求时,如果文件缓存过期,浏览器通过 If-Modified-Since 字段带上这个时间,发送给服务器,由服务器比较时间戳来判断文件是否有修改。如果没有修改,服务器返回304告诉浏览器继续使用缓存;如果有修改,则返回200,同时返回最新的文件。

    2、 Application Cache 缓存机制

    以文件为单位进行缓存,且文件有一定更新机制(类似于浏览器缓存机制)AppCache 原理有两个关键点:manifest 属性和 manifest 文件。

    <!DOCTYPE html>
    <html manifest="demo_html.appcache">
    // HTML 在头中通过 manifest 属性引用 manifest 文件
    // manifest 文件:就是上面以 appcache 结尾的文件,是一个普通文件文件,列出了需要缓存的文件
    // 浏览器在首次加载 HTML 文件时,会解析 manifest 属性,并读取 manifest 文件,获取 Section:CACHE MANIFEST 下要缓存的文件列表,再对文件缓存
    <body>
    ...
    </body>
    </html>
     
    // 原理说明如下:
    // AppCache 在首次加载生成后,也有更新机制。被缓存的文件如果要更新,需要更新 manifest 文件
    // 因为浏览器在下次加载时,除了会默认使用缓存外,还会在后台检查 manifest 文件有没有修改(byte by byte)发现有修改,就会重新获取 manifest 文件,对 Section:CACHE MANIFEST 下文件列表检查更新
    // manifest 文件与缓存文件的检查更新也遵守浏览器缓存机制
    // 如用户手动清了 AppCache 缓存,下次加载时,浏览器会重新生成缓存,也可算是一种缓存的更新
    // AppCache 的缓存文件,与浏览器的缓存文件分开存储的,因为 AppCache 在本地有 5MB(分 HOST)的空间限制
    

    实现:

     
     // 通过设置WebView的settings来实现
     WebSettings settings = getSettings();
    
     String cacheDirPath = context.getFilesDir().getAbsolutePath()+"cache/";
     settings.setAppCachePath(cacheDirPath);
     // 1. 设置缓存路径
    
     settings.setAppCacheMaxSize(20*1024*1024);
     // 2. 设置缓存大小
    
     settings.setAppCacheEnabled(true);
     // 3. 开启Application Cache存储机制
    
    

    3、Dom Storage 缓存机制

    通过存储字符串的 Key - Value 对来提供

    DOM Storage 分为 sessionStorage & localStorage; 二者使用方法基本相同,区别在于作用范围不同:
    a. sessionStorage:具备临时性,即存储与页面相关的数据,它在页面关闭后无法使用
    b.localStorage:具备持久性,即保存的数据在页面关闭后也可以使用。

     // 通过设置 `WebView`的`Settings`类实现
     WebSettings settings = getSettings();
     // 开启DOM storage
     settings.setDomStorageEnabled(true);
    

    4、 Web SQL Database 缓存机制

    基于 SQL 的数据库存储机制

     // 通过设置WebView的settings实现
     WebSettings settings = getSettings();
     // 设置缓存路径
     String cacheDirPath = context.getFilesDir().getAbsolutePath()+"cache/";
     settings.setDatabasePath(cacheDirPath);
     // 开启 数据库存储机制
     settings.setDatabaseEnabled(true);
    

    5、Indexed Database 缓存机制
    属于 NoSQL 数据库,通过存储字符串的 Key - Value 对来提供

    // 通过设置WebView的settings实现
    WebSettings settings = getSettings();
    // 只需设置支持JS就自动打开IndexedDB存储机制
    // Android 在4.4开始加入对 IndexedDB 的支持,只需打开允许 JS 执行的开关就好了。
    settings.setJavaScriptEnabled(true);
    

    6、File System 缓存机制(H5页面新加入的缓存机制,虽然Android WebView暂时不支持,但会进行简单介绍)

    为 H5页面的数据 提供一个虚拟的文件系统,可进行文件(夹)的创建、读、写、删除、遍历等操作,就像 Native App 访问本地文件系统一样。

错误信息页面是什么?试试 清单文件application加入节点加入 android:usesCleartextTraffic="true"