GVKun编程网logo

Swift WebView WebRTC 无法同时显示两个对等点(swiftui webview)

4

在这篇文章中,我们将带领您了解SwiftWebViewWebRTC无法同时显示两个对等点的全貌,包括swiftuiwebview的相关情况。同时,我们还将为您介绍有关AndroidWebview-调用

在这篇文章中,我们将带领您了解Swift WebView WebRTC 无法同时显示两个对等点的全貌,包括swiftui webview的相关情况。同时,我们还将为您介绍有关Android Webview - 调用方法 webView.loadUrl 时,chromium 会显示 ANR(带有标题)、Android Webview -> 在 webview 的 localStorage 中设置值时未捕获的安全错误、android webview js 交互,响应 webview 图片的响应事件、Android WebView 系列文章 1 - 关于 WebView 基本使用介绍的知识,以帮助您更好地理解这个主题。

本文目录一览:

Swift WebView WebRTC 无法同时显示两个对等点(swiftui webview)

Swift WebView WebRTC 无法同时显示两个对等点(swiftui webview)

如何解决Swift WebView WebRTC 无法同时显示两个对等点

我想通过 WebView 使用 WebRTC。 我使用的是iOS系统版本:14.4的手机, 我的 Mac 的 Xcode 版本:12.4 打开页面使用WebRTC时, 首先,它将显示有关相机和麦克风隐私的警报消息。 enter image description here

当我点击“允许”按钮时, 然后将显示现场直播视图,图像在我身边。 enter image description here

单击视图左上角的“X”按钮后, 另一个直播视图出现了,图像在我伙伴的一边。 enter image description here

然后我再次单击视图左上角的“X”按钮。 它最终显示了网页的原始视图。 但图像全部冻结。 enter image description here

其实我只是在这个项目的 info.plist 中添加了麦克风和摄像头的隐私。

那么,我的问题是如何去除直播视图,并在源页面中连接两个peer,而不是冻结状态。

Android Webview - 调用方法 webView.loadUrl 时,chromium 会显示 ANR(带有标题)

Android Webview - 调用方法 webView.loadUrl 时,chromium 会显示 ANR(带有标题)

如何解决Android Webview - 调用方法 webView.loadUrl 时,chromium 会显示 ANR(带有标题)?

我们有一个使用 Android webview 的应用程序,我们注意到自 2021 年 4 月 7 日起调用以下代码时出现 ANR(该代码在 UIThread 中调用):

public void onLoadUrlWithHeaders(final String url,final Map<String,String> headers) {
        Log.d(TAG,"onLoadUrl with headers : " + url);
        webView.loadUrl(url,headers);
    }

此问题是间歇性的,仅在某些设备上发生。例如在我们的测试设备上: 摩托罗拉 Moto X (4) Android 9 (SDK 28)

三星 SM - A520F Android 8 (SDK 26) - Webview Chrome 90.0.4430.82

问题出现在我们于 2020 年 12 月发布的应用版本中,该版本直到 4 月才出现上述 ANR。

ANR后A520F的/data/anr/traces.txt文件摘录

suspend all histogram:  Sum: 340.474ms 99% C.I. 0.042ms-187.678ms Avg: 4.365ms Max: 283.301ms
DALVIK THREADS (69):
"Signal Catcher" daemon prio=5 tid=3 Runnable
  | group="system" sCount=0 dsCount=0 flags=0 obj=0x13680248 self=0x7d302c1400
  | sysTid=15932 nice=0 cgrp=default sched=0/0 handle=0x7d254fe4f0
  | state=R schedstat=( 0 0 0 ) utm=2 stm=3 core=3 HZ=100
  | stack=0x7d25404000-0x7d25406000 stackSize=1005KB
  | held mutexes= "mutator lock"(shared held)
  native: #00 pc 0000000000397510  /system/lib64/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamicns0_11char_traitsIcEEEEiP12BacktraceMapPKcPNS_9ArtMethodEPv+212)
  native: #01 pc 000000000045dce8  /system/lib64/libart.so (_ZNK3art6Thread9DumpStackERNSt3__113basic_ostreamicns1_11char_traitsIcEEEEbP12BacktraceMapb+348)
  native: #02 pc 000000000047549c  /system/lib64/libart.so (_ZN3art14DumpCheckpoint3RunEPNS_6ThreadE+880)
  native: #03 pc 000000000046d774  /system/lib64/libart.so (_ZN3art10ThreadList13runcheckpointEPNS_7ClosureES2_+480)
  native: #04 pc 000000000046d17c  /system/lib64/libart.so (_ZN3art10ThreadList4DumpERNSt3__113basic_ostreamicns1_11char_traitsIcEEEEb+796)
  native: #05 pc 000000000046cd1c  /system/lib64/libart.so (_ZN3art10ThreadList14DumpForSigQuitERNSt3__113basic_ostreamicns1_11char_traitsIcEEEE+920)
  native: #06 pc 00000000004426f0  /system/lib64/libart.so (_ZN3art7Runtime14DumpForSigQuitERNSt3__113basic_ostreamicns1_11char_traitsIcEEEE+196)
  native: #07 pc 000000000044bb88  /system/lib64/libart.so (_ZN3art13SignalCatcher13HandleSigQuitEv+1676)
  native: #08 pc 000000000044a9c0  /system/lib64/libart.so (_ZN3art13SignalCatcher3RunEPv+388)
  native: #09 pc 0000000000067d04  /system/lib64/libc.so (_ZL15__pthread_startPv+200)
  native: #10 pc 000000000001f348  /system/lib64/libc.so (__start_thread+68)
  (no managed stack frames)

"main" prio=5 tid=1 Native
  | group="main" sCount=1 dsCount=0 flags=1 obj=0x731fda50 self=0x7d302c0a00
  | sysTid=15926 nice=-10 cgrp=default sched=0/0 handle=0x7d353e19c8
  | state=R schedstat=( 0 0 0 ) utm=4634 stm=638 core=2 HZ=100
  | stack=0x7fd505c000-0x7fd505e000 stackSize=8MB
  | held mutexes=
  kernel: (Couldn''t read /proc/self/task/15926/stack)
  native: #00 pc 00000000035e867c  /data/app/com.android.chrome-ZK4DdobzNyyzf7J8pPGLPg==/base.apk (???)
  native: #01 pc 00000000033e32d8  /data/app/com.android.chrome-ZK4DdobzNyyzf7J8pPGLPg==/base.apk (???)
  at J.N.MAqmDh4t(Native method)
  **at org.chromium.content.browser.framehost.NavigationControllerImpl.c(chromium-Monochrome.aab-stable-443008223:17)
  at org.chromium.android_webview.AwContents.w(chromium-Monochrome.aab-stable-443008223:35)
  at org.chromium.android_webview.AwContents.v(chromium-Monochrome.aab-stable-443008223:14)
  at com.android.webview.chromium.WebViewChromium.loadUrl(chromium-Monochrome.aab-stable-443008223:5)**
  at android.webkit.WebView.loadUrl(WebView.java:927)
  at br.com.gabba.Box.l.o(:-1)
  at br.com.gabba.Box.model.BO.k$a.c(:-1)
  at br.com.gabba.Box.model.BO.k$a.b(:-1)
  at br.com.gabba.Box.model.BO.LoginAuthBO.i(:-1)
  at br.com.gabba.Box.model.BO.LoginAuthBO_.H(:-1)
  at br.com.gabba.Box.model.BO.LoginAuthBO_$a.run(:-1)
  at android.os.Handler.handleCallback(Handler.java:789)
  at android.os.Handler.dispatchMessage(Handler.java:98)
  at android.os.Looper.loop(Looper.java:164)
  at android.app.ActivityThread.main(ActivityThread.java:6944)
  at java.lang.reflect.Method.invoke(Native method)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

Here is the entire traces.txt

Similar problem in Google Mobile Ads SDK Developers

解决方法

在 Activity onDestroy 上有一个遗留代码。

 @Override
    protected void onDestroy() {
        super.onDestroy();

        WebView webView = getWebView();

        if (webView != null) {
            webView.setWebViewClient(null);
            webView.setWebChromeClient(null);
            webView.loadUrl("about:blank");
        }
    }

此代码可以在 webview 中的注销请求后立即执行。当响应仍在等待中时。

在某些时候,在 Chromium 更新之后,当发生这种情况时(onDestroy 带有待处理的响应),在 webView.loadUrl 的下一次执行中观察到 ANR。

我们创建一个控件来等待注销响应以完成活动。 Play 商店中注册的 ANR 数量下降了 99% 以上。或者您可以简单地从 ondestroy 中删除上述代码。

Android Webview -> 在 webview 的 localStorage 中设置值时未捕获的安全错误

Android Webview -> 在 webview 的 localStorage 中设置值时未捕获的安全错误

如何解决Android Webview -> 在 webview 的 localStorage 中设置值时未捕获的安全错误

我需要通过在本地和会话存储中设置一些属性来在 android 中加载 webview。

我尝试在 webView.evaluateJavascript("window.localStorage.setItem(''$key'',''$val1'');",null) 的帮助下将值保存在本地/会话存储中,但出现以下错误。

未捕获的安全错误:无法从“窗口”读取“localStorage”属性:此文档的访问被拒绝。

webView.settings.javaScriptEnabled = true
        webView.settings.domStorageEnabled = true
        webView.settings.databaseEnabled = true
        webView.settings.allowFileAccess = true 
        webView.settings.allowContentAccess = true

  webView.evaluateJavascript("window.localStorage.setItem(''$key'',null) 
     webView.loadUrl("url to load")

我还在 manifest 中设置了 android:usesCleartextTraffic="true"

对于这个问题有什么建议吗?

解决方法

首先添加这些行

websettings.setDomStorageEnabled(true); // Turn on DOM storage
websettings.setAllowFileAccess(true); // can read the file cache
websettings.setAppCacheEnabled(true); //Enable H5 (APPCache) caching

然后

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
  webView.evaluateJavascript("window.localStorage.setItem(''"+ key +"'',''"+ val +"'');",null);
} else {
  webView.loadUrl("javascript:localStorage.setItem(''"+ key +"'',''"+ val +"'');");
}

android webview js 交互,响应 webview 图片的响应事件

android webview js 交互,响应 webview 图片的响应事件

方案思路,

1. 在点击图片的时候调用本地的 java 方法并给出响应的图片地址

2. 本地获得图片地址后,开启一个遮罩 activity 进行显示和处理


第二步的实现很容易实现,关键是第一步的实现,在网页中点击图片不会调用本地的 java 代码。那么我们需要给这个点击事件加上相应的 js 函数,让点击事件调用的 js 函数来调用我们提前准备好的 java 函数,等我们捕获到图片的 url 剩下的就好处理了。

关键点就是给普通的 html 注入我们的 js 函数,让图片能够响应点击并调用 js 函数,在通过 js 函数来调用我们的 java 函数。听起来好像有点绕,不过也不难,下面我们用代码实现下


对 java 和 js 交互还不熟悉的同学,请参照前面的文章

http://blog.csdn.net/wangtingshuai/article/details/8631835


这次实例的主要功能:点击图片在新的 activity 中展示,对图片能够进行手势操作,包括双指缩放等

效果图


加载 webview 的 activity 代码  


[java] view plaincopy

  1. package wst.webview;  

  2.   

  3. import android.annotation.SuppressLint;  

  4. import android.app.Activity;  

  5. import android.content.Context;  

  6. import android.content.Intent;  

  7. import android.graphics.Bitmap;  

  8. import android.os.Bundle;  

  9. import android.webkit.WebView;  

  10. import android.webkit.WebViewClient;  

  11.   

  12. @SuppressLint("SetJavaScriptEnabled")  

  13. public class MainActivity extends Activity {  

  14.   

  15.     private WebView contentWebView = null;  

  16.   

  17.     @SuppressLint("SetJavaScriptEnabled")  

  18.     @Override  

  19.     public void onCreate(Bundle savedInstanceState) {  

  20.         super.onCreate(savedInstanceState);  

  21.         setContentView(R.layout.main);  

  22.         contentWebView = (WebView) findViewById(R.id.webview);  

  23.         // 启用 javascript  

  24.         contentWebView.getSettings().setJavaScriptEnabled(true);  

  25.         // 随便找了个带图片的网站  

  26.         contentWebView.loadUrl("http://www.weim.me/12408.html");  

  27.         // 添加 js 交互接口类,并起别名 imagelistner  

  28.         contentWebView.addJavascriptInterface(new JavascriptInterface(this), "imagelistner");  

  29.         contentWebView.setWebViewClient(new MyWebViewClient());  

  30.   

  31.     }  

  32.   

  33.     // 注入 js 函数监听  

  34.     private void addImageClickListner() {  

  35.         // 这段 js 函数的功能就是,遍历所有的 img 几点,并添加 onclick 函数,函数的功能是在图片点击的时候调用本地 java 接口并传递 url 过去  

  36.         contentWebView.loadUrl("javascript:(function(){" +  

  37.         "var objs = document.getElementsByTagName(\"img\"); " +   

  38.                 "for(var i=0;i<objs.length;i++)  " +   

  39.         "{"  

  40.                 + "    objs[i].onclick=function()  " +   

  41.         "    {  "   

  42.                 + "        window.imagelistner.openImage(this.src);  " +   

  43.         "    }  " +   

  44.         "}" +   

  45.         "})()");  

  46.     }  

  47.   

  48.     // js 通信接口  

  49.     public class JavascriptInterface {  

  50.   

  51.         private Context context;  

  52.   

  53.         public JavascriptInterface(Context context) {  

  54.             this.context = context;  

  55.         }  

  56.   

  57.         public void openImage(String img) {  

  58.             System.out.println(img);  

  59.             //  

  60.             Intent intent = new Intent();  

  61.             intent.putExtra("image", img);  

  62.             intent.setClass(context, ShowWebImageActivity.class);  

  63.             context.startActivity(intent);  

  64.             System.out.println(img);  

  65.         }  

  66.     }  

  67.   

  68.     // 监听  

  69.     private class MyWebViewClient extends WebViewClient {  

  70.         @Override  

  71.         public boolean shouldOverrideUrlLoading(WebView view, String url) {  

  72.   

  73.             return super.shouldOverrideUrlLoading(view, url);  

  74.         }  

  75.   

  76.         @Override  

  77.         public void onPageFinished(WebView view, String url) {  

  78.   

  79.             view.getSettings().setJavaScriptEnabled(true);  

  80.   

  81.             super.onPageFinished(view, url);  

  82.             // html 加载完成之后,添加监听图片的点击 js 函数  

  83.             addImageClickListner();  

  84.   

  85.         }  

  86.   

  87.         @Override  

  88.         public void onPageStarted(WebView view, String url, Bitmap favicon) {  

  89.             view.getSettings().setJavaScriptEnabled(true);  

  90.   

  91.             super.onPageStarted(view, url, favicon);  

  92.         }  

  93.   

  94.         @Override  

  95.         public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {  

  96.   

  97.             super.onReceivedError(view, errorCode, description, failingUrl);  

  98.   

  99.         }  

  100.     }  

  101.   

  102. }  


展示图片的 activity 代码


[java] view plaincopy

  1. package wst.webview;  

  2.   

  3. import java.io.IOException;  

  4. import java.io.InputStream;  

  5. import java.net.URL;  

  6.   

  7. import android.app.Activity;  

  8. import android.graphics.drawable.BitmapDrawable;  

  9. import android.graphics.drawable.Drawable;  

  10. import android.os.Bundle;  

  11. import android.widget.TextView;  

  12.   

  13. public class ShowWebImageActivity extends Activity {  

  14.     private TextView imageTextView = null;  

  15.     private String imagePath = null;  

  16.     private ZoomableImageView imageView = null;  

  17.   

  18.     @Override  

  19.     protected void onCreate(Bundle savedInstanceState) {  

  20.         super.onCreate(savedInstanceState);  

  21.         setContentView(R.layout.show_webimage);  

  22.         this.imagePath = getIntent().getStringExtra("image");  

  23.   

  24.         this.imageTextView = (TextView) findViewById(R.id.show_webimage_imagepath_textview);  

  25.         imageTextView.setText(this.imagePath);  

  26.         imageView = (ZoomableImageView) findViewById(R.id.show_webimage_imageview);  

  27.   

  28.         try {  

  29.             imageView.setImageBitmap(((BitmapDrawable) ShowWebImageActivity.loadImageFromUrl(this.imagePath)).getBitmap());  

  30.         } catch (IOException e) {  

  31.             e.printStackTrace();  

  32.         }  

  33.     }  

  34.   

  35.     public static Drawable loadImageFromUrl(String url) throws IOException {  

  36.   

  37.         URL m = new URL(url);  

  38.         InputStream i = (InputStream) m.getContent();  

  39.         Drawable d = Drawable.createFromStream(i, "src");  

  40.         return d;  

  41.     }  

  42. }  



图片布局文件 


[html] view plaincopy

  1. <?xml version="1.0" encoding="utf-8"?>  

  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  

  3.     android:layout_width="fill_parent"  

  4.     android:layout_height="fill_parent"  

  5.     android:orientation="vertical" >  

  6.   

  7.     <!-- TODO 默认占位图 -->  

  8.   

  9.     <wst.webview.ZoomableImageView  

  10.         android:id="@+id/show_webimage_imageview"  

  11.         android:layout_width="fill_parent"  

  12.         android:layout_height="fill_parent"  

  13.         android:scaleType="matrix"  

  14.         android:src="@drawable/icon" />  

  15.   

  16.     <TextView  

  17.         android:id="@+id/show_webimage_imagepath_textview"  

  18.         android:layout_width="fill_parent"  

  19.         android:layout_height="wrap_content"  

  20.         android:gravity="center"  

  21.         android:textColor="#ffff0000" />  

  22.   

  23. </LinearLayout> 



Android WebView 系列文章 1 - 关于 WebView 基本使用介绍

Android WebView 系列文章 1 - 关于 WebView 基本使用介绍

关于 WebView 基本使用介绍
目录介绍
0. 关于 WebView 的目录结构图
1. 关于 WebView 的使用优点
2.WebView 最简单的使用方法
3.WebView 的常用方法

    * 3.1 WebView 的回退与前进与刷新
    * 3.2 WebView 的状态
    * 3.3 清除缓存数据

4.WebView 常用类的介绍

    * 4.1 WebSettings 类
    * 4.2 WebViewClient 类
    * 4.3 WebChromeClient 类

5.WebView 注意事项

    * 5.1 动态创建 WebView 使用上下文为全局上下文
    * 5.2 Activity 销毁的时候,销毁 WebView

 

 

1. 关于 WebView 的使用优点

    * 可以直接显示和渲染 web 页面,直接显示网页
    * webview 可以直接用 html 文件(网络上或本地 assets 中)作布局
    * 和 JavaScript 交互调用


2.WebView 最简单的使用方法

    * 布局

<WebView
    android:id="@+id/wv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
注意添加权限:
<uses-permission android:name="android.permission.INTERNET"/>

    * 在 activity 中最简单的使用

webview = (WebView) findViewById(R.id.webView1);
webview.loadUrl ("http://www.baidu.com/");                    // 加载 web 资源
webView.loadUrl ("file:///android_asset/example.html");       // 加载本地资源
这个时候发现一个问题,启动应用后,自动的打开了系统内置的浏览器,解决这个问题需要为 webview 设置 WebViewClient,并重写方法:
webview.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                // 返回值是 true 的时候控制去 WebView 打开,为 false 调用系统浏览器或第三方浏览器
                return true;
            }
 // 还可以重写其他的方法
});


3.WebView 的常用方法

    * 3.1 WebView 的回退与前进与刷新
    *
        * WebView 前进用到的时候可能不多,但是回退这个功能相当有用。当加载网页的时候,我们点击了几层链接之后,点击返回键,突然间就退出应用或者直接销毁了当前组件,相信这种交互不是用户需要的,因为有可能用户只是想回退到上一层级页面。
        * 关于方法介绍与使用


// 判断是否有可以回退,可以返回 true
webView.canGoBack();
// 返回上一层级
webView.goBack();
// 判断是否可以前进,可以返回 true
webView.canGoForward();
// 进入上一层级
webView.goForward();
// 刷新
webView.reload();

// 改写物理按键 —— 返回的逻辑 这个很重要
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode==KeyEvent.KEYCODE_BACK) {
        if(wv.canGoBack()) {
            wv.goBack ();// 返回上一页面
            return true;
        }
    }
    return super.onKeyDown(keyCode, event);
}


    * 3.2 WebView 的状态

// 激活 WebView 为活跃状态,能正常执行网页的响应
webView.onResume() ;

// 当页面被失去焦点被切换到后台不可见状态,需要执行 onPause// 通过 onPause 动作通知内核暂停所有的动作,比如 DOM 的解析、plugin 的执行、JavaScript 执行。
webView.onPause();

// 当应用程序 (存在 webview) 被切换到后台时,这个方法不仅仅针对当前的 webview 而是全局的全应用程序的 webview// 它会暂停所有 webview 的 layout,parsing,javascripttimer。降低 CPU 功耗。
webView.pauseTimers()
// 恢复 pauseTimers 状态
webView.resumeTimers();

// 销毁 Webview// 在关闭了 Activity 时,如果 Webview 的音乐或视频,还在播放。就必须销毁 Webview// 但是注意:webview 调用 destory 时,webview 仍绑定在 Activity 上 // 这是由于自定义 webview 构建时传入了该 Activity 的 context 对象 // 因此需要先从父容器中移除 webview, 然后再销毁 webview:
rootLayout.removeView(webView);
webView.destroy();

    * 3.3 清除缓存数据

// 清除网页访问留下的缓存
// 由于内核缓存是全局的因此这个方法不仅仅针对 webview 而是针对整个应用程序.
Webview.clearCache(true);

// 清除当前 webview 访问的历史记录 // 只会 webview 访问历史记录里的所有记录除了当前访问记录
Webview.clearHistory();

// 这个 api 仅仅清除自动完成填充的表单数据,并不会清除 WebView 存储到本地的数据
Webview.clearFormData();


4.WebView 常用类的介绍

    * 4.1 WebSettings 类
    *
        * 主要的作用对 WebView 进行配置和管理


// 声明 WebSettings 子类
WebSettings webSettings = webView.getSettings();

// 注意:这个很重要   如果访问的页面中要与 Javascript 交互,则 webview 必须设置支持 Javascript
webSettings.setJavaScriptEnabled(true);

// 支持插件
webSettings.setPluginsEnabled(true);

// 设置自适应屏幕,两者合用
webSettings.setUseWideViewPort (true); // 将图片调整到适合 webview 的大小
webSettings.setLoadWithOverviewMode (true); // 缩放至屏幕的大小

// 缩放操作
webSettings.setSupportZoom (true); // 支持缩放,默认为 true。是下面那个的前提。
webSettings.setBuiltInZoomControls (true); // 设置内置的缩放控件。若为 false,则该 WebView 不可缩放
webSettings.setDisplayZoomControls (false); // 隐藏原生的缩放控件

// 其他细节操作
webSettings.setCacheMode (WebSettings.LOAD_CACHE_ELSE_NETWORK); // 关闭 webview 中缓存
webSettings.setAllowFileAccess (true); // 设置可以访问文件
webSettings.setJavaScriptCanOpenWindowsAutomatically (true); // 支持通过 JS 打开新窗口
webSettings.setLoadsImagesAutomatically (true); // 支持自动加载图片
webSettings.setDefaultTextEncodingName ("utf-8");// 设置编码格式

    *
        * 设置 WebView 缓存

 

    *
        * 当加载 html 页面时,WebView 会在 /data/data/ 包名目录下生成 database 与 cache 两个文件夹
        * 请求的 URL 记录保存在 WebViewCache.db,而 URL 的内容是保存在 WebViewCache 文件夹下
        * 是否启用缓存:


// 优先使用缓存:
WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
    // 缓存模式如下:
    //LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
    //LOAD_DEFAULT: (默认)根据 cache-control 决定是否从网络上取数据。
    //LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
    //LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者 no-cache,都使用缓存中的数据。

// 不使用缓存:
WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

webSettings.setDomStorageEnabled (true); // 开启 DOM storage API 功能
webSettings.setDatabaseEnabled (true);  // 开启 database storage API 功能
webSettings.setAppCacheEnabled (true);// 开启 Application Caches 功能

String cacheDirPath = getFilesDir().getAbsolutePath() + APP_CACAHE_DIRNAME;
webSettings.setAppCachePath (cacheDirPath); // 设置  Application Caches 缓存目录

    * 4.2 WebViewClient 类
    *
        * 主要的作用是处理各种通知和请求事件
        * shouldOverrideUrlLoading () 方法


shouldOverrideUrlLoading () 方法,使得打开网页时不调用系统浏览器, 而是在本 WebView 中显示
webView.setWebViewClient(new WebViewClient(){
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
});

    *
        * onPageStarted()


作用:开始载入页面调用的,我们可以设定一个 loading 的页面,告诉用户程序在等待网络响应。
webView.setWebViewClient(new WebViewClient(){
    @Override
    public void  onPageStarted(WebView view, String url, Bitmap favicon) {
        // 设定加载开始的操作
    }
});

    *
        * onPageFinished()


作用:在页面加载结束时调用。我们可以关闭 loading 条,切换程序动作。
webView.setWebViewClient(new WebViewClient(){
    @Override
    public void onPageFinished(WebView view, String url) {
        // 设定加载结束的操作
    }
});

    *
        * onLoadResource()


作用:在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。
webView.setWebViewClient(new WebViewClient(){
    @Override
    public boolean onLoadResource(WebView view, String url) {
        // 设定加载资源的操作
    }
});

    *
        * onReceivedError()


作用:加载页面的服务器出现错误时(如 404)调用。
App 里面使用 webview 控件的时候遇到了诸如 404 这类的错误的时候,若也显示浏览器里面的那种错误提示页面就显得很丑陋了,那么这个时候我们的 app 就需要加载一个本地的错误提示页面,即 webview 如何加载一个本地的页面

// 步骤 1:写一个 html 文件(error_handle.html),用于出错时展示给用户看的提示页面
// 步骤 2:将该 html 文件放置到代码根目录的 assets 文件夹下
// 步骤 3:复写 WebViewClient 的 onRecievedError 方法
// 该方法传回了错误码,根据错误类型可以进行不同的错误分类处理
webView.setWebViewClient(new WebViewClient(){
    @Override
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl){
        switch(errorCode){
            case HttpStatus.SC_NOT_FOUND:
                view.loadUrl("file:///android_assets/error_handle.html");
                break;
        }
    }
});

    *
        * onReceivedSslError()


作用:处理 https 请求
webView 默认是不处理 https 请求的,页面显示空白,需要进行如下设置:

webView.setWebViewClient(new WebViewClient() {   
    @Override   
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {   
        handler.proceed ();    // 表示等待证书响应
        //handler.cancel ();      // 表示挂起连接,为默认方式
        //handler.handleMessage (null);    // 可做其他处理
    }   
});   

    * 4.3 WebChromeClient 类
    *
        * 主要的作用是辅助 WebView 处理 Javascript 的对话框,网站图标,网站标题等等
        * onProgressChanged()


作用:获得网页的加载进度并显示
webview.setWebChromeClient(new WebChromeClient(){
    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        if (newProgress < 100) {
            String progress = newProgress + "%";
            progress.setText(progress);
        }
    }
});

    *
        * onReceivedTitle()


作用:获取 Web 页中的标题
每个网页的页面都有一个标题
webview.setWebChromeClient(new WebChromeClient(){
    @Override
    public void onReceivedTitle(WebView view, String title) {
        titleview.setText(title);
    }
}


5.WebView 注意事项

    * 5.1 动态创建 WebView 使用上下文为全局上下文

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
mWebView = new WebView(getApplicationContext());
mWebView.setLayoutParams(params);
mLayout.addView(mWebView);

    * 5.2 Activity 销毁的时候,销毁 WebView

在 Activity 销毁( WebView )的时候,先让 WebView 加载 null 内容,然后移除 WebView,再销毁 WebView,最后置空。
@Override
protected void onDestroy() {
    if (mWebView != null) {
        mWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
        mWebView.clearHistory();

        ((ViewGroup) mWebView.getParent()).removeView(mWebView);
        mWebView.destroy();
        mWebView = null;
    }
    super.onDestroy();
}

 

 

 

 

 

 

关于Swift WebView WebRTC 无法同时显示两个对等点swiftui webview的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Android Webview - 调用方法 webView.loadUrl 时,chromium 会显示 ANR(带有标题)、Android Webview -> 在 webview 的 localStorage 中设置值时未捕获的安全错误、android webview js 交互,响应 webview 图片的响应事件、Android WebView 系列文章 1 - 关于 WebView 基本使用介绍的相关知识,请在本站寻找。

本文标签:

上一篇tableView 中的 Swift 第一个单元格丢失了,因为添加了 UISearchController(swiftui 列表)

下一篇Xcode Swift MacOs - 在没有 StoryBoard 和 ViewController 的情况下隐藏/显示窗口