• android webview


    1:基本使用:

    @SuppressWarnings("deprecation")
    public class ArticleWebView_new extends WebView {
        private WebSettings wvsetting;
    
        public ArticleWebView_new(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            // TODO Auto-generated constructor stub
            instance(context);
        }
    
        public ArticleWebView_new(Context context, AttributeSet attrs) {
            super(context, attrs);
            // TODO Auto-generated constructor stub
            instance(context);
        }
    
        public ArticleWebView_new(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
            instance(context);
        }
    
        @SuppressLint({ "SetJavaScriptEnabled", "NewApi" })
        private void instance(Context context) {
            // TODO Auto-generated method stub
                    wvsetting = this.getSettings();
            // 设置是否允许通过file
            // url加载的Javascript可以访问其他的源,包括其他的文件和http,https等其他的源。这个设置在JELLY_BEAN以前的版本默认是允许,在JELLY_BEAN及以后的版本中默认是禁止的
            try {
                if (Build.VERSION.SDK_INT >= 16) {
                    Class<?> clazz = this.getSettings().getClass();
                    Method method = clazz.getMethod(
                            "setAllowUniversalAccessFromFileURLs", boolean.class);
                    if (method != null) {
                        method.invoke(this.getSettings(), true);
                    }
                }
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
            // 内嵌图片时加载缓慢的问题
            if (Build.VERSION.SDK_INT >= 19) {
                wvsetting.setLoadsImagesAutomatically(true);
            } else {
                wvsetting.setLoadsImagesAutomatically(false);
            }
            // 屏幕适配滚动问题
            wvsetting
                    .setUserAgentString("Mozilla/5.0 (Linux; U; Android 4.4.2; zh-cn;CmsTop Cloud Mobile) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0  Safari/537.36");
            wvsetting.setJavaScriptEnabled(true);// 支持js
            wvsetting.setSupportZoom(false);
            wvsetting.setTextSize(TextSize.NORMAL);
            // wvsetting.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
            wvsetting.setAllowFileAccess(true);
    
            wvsetting.setDomStorageEnabled(true);
            wvsetting.setSupportMultipleWindows(true);
            wvsetting.setPluginState(WebSettings.PluginState.ON);
            // ws.setPluginsEnabled(true);
            wvsetting.setLoadWithOverviewMode(true);
            wvsetting.setUseWideViewPort(true);
            wvsetting.setDefaultTextEncodingName("utf-8");
            wvsetting.setCacheMode(WebSettings.LOAD_NO_CACHE);
                }
    
    }
    View Code


    2:一些常用的监听类型

    public class NewsWebViewClient extends WebViewClient {
    
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    view.loadUrl(url);
                return true;
            }
    
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                // TODO Auto-generated method stub
                super.onPageStarted(view, url, favicon);
            }
    
            @Override
            public void onReceivedError(WebView view, int errorCode,
                    String description, String failingUrl) {
                // TODO Auto-generated method stub
                super.onReceivedError(view, errorCode, description, failingUrl);
    
            }
    
            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler,
                    SslError error) {
                // TODO Auto-generated method stub
                super.onReceivedSslError(view, handler, error);
                handler.proceed(); // 接受所有证书
            }
    
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                            //是配合图片加载缓存缓慢的问题
                if (!view.getSettings().getLoadsImagesAutomatically()) {
                    view.getSettings().setLoadsImagesAutomatically(true);
                }
            }
        }
    View Code

    3:当链接里包含下载地址时:

    wv_link.setDownloadListener(new DownloadListener() {
    
                    @Override
                    public void onDownloadStart(String url, String userAgent,
                            String contentDisposition, String mimetype,
                            long contentLength) {
                        // TODO Auto-generated method stub
                        Uri uri = Uri.parse(url);
                        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                        startActivity(intent);
                    }
                });
    View Code

    4:android 5.0之后的兼容问题,部分js加载效果不生效的处理;entity.getResource_url()基类js;直接view_articleWeb.loadDataWithBaseURL(null,detailEntity.getContent(), "text/html", "UTF-8", null);会有部分不兼容的问题

    view_articleWeb.loadDataWithBaseURL(entity.getResource_url(),
                            detailEntity.getContent(), "text/html", "UTF-8", null);


    5:webview嵌套多层 返回上一层的问题

    1:创建数组
         private List<String> urlList = new ArrayList<String>();    
    
    2:数据何时添加呢
    public class NewsWebViewClient extends WebViewClient {
    
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if (url.startsWith("http://") || url.startsWith("https://")) {
                    view.loadUrl(url);
                    urlList.add(url);
                }
                return true;
            }
    
            
    
            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler,
                    SslError error) {
                // TODO Auto-generated method stub
                super.onReceivedSslError(view, handler, error);
                handler.proceed(); // 接受所有证书
            }
            
        }
    
    3:怎么返回上一层呢
    if (view_articleWeb != null && view_articleWeb.canGoBack()) {
                    if (urlList.size() > 1) {
                        urlList.remove(urlList.size() - 1);
                        view_articleWeb.goBack();
                    } else {
                        if (urlList.size() == 0) {
                            finishActi(this, animal);
                        } else {
                            urlList.remove(urlList.size() - 1);
                            view_articleWeb.loadDataWithBaseURL(null,
                                    detailEntity.getContent(), "text/html",
                                    "UTF-8", "about:blank");
                        }
                    }
                    return;
                }
    
    
    4:aty 销毁时记得清空
        urlList.clear();
    View Code


    6:页面里嵌套有音视频时,切换页面暂停播放时;这个只要实现在onpause里暂停,onresume里继续就好了 不过这两个方法对应使用才有效

    @Override
        public void onResume() {
            // TODO Auto-generated method stub
            super.onTabResumeFragment();
            if (wv_link != null) {
                try {
                    wv_link.getClass().getMethod("onResume")
                            .invoke(wv_link, (Object[]) null);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    
    
    @Override
        public void onPause() {
            // TODO Auto-generated method stub
            super.onTabPauseFragment();
            if (wv_link != null) {
                currentTime = (System.currentTimeMillis() / 1000);
                try {
                    wv_link.getClass().getMethod("onPause")
                            .invoke(wv_link, (Object[]) null);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                sackAudioFocus();
            }
        }
    
    上面针对一般般的webview里嵌套视频就没有问题了,但是当有比较low的音频时,也是不好使,所以还有暴力的方法通过抢占资源才可以达到暂停的效果
    /**
         * 抢取音频焦点
         */
        private void sackAudioFocus() {
            // TODO Auto-generated method stub
            if (isHaveAudio) {
                int i = 0;
                do {
                    int result = audioManager.requestAudioFocus(afChangeListener,
                            AudioManager.STREAM_MUSIC,
                            AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
                    if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
                        break;
                    }
                    i++;
                } while (i < 10);
                isHaveAudio = false;
            }
        }
    View Code

    7:含有音频的webview不要忘记了在配置文件里加上硬件加速 ,否则有声音没画面

    <activity
                android:name=".DetailNewsItemActivity"
                android:hardwareAccelerated="true"
                ......
                >
  • 相关阅读:
    使用JMeter进行RESTful API测试
    DVWA reCAPTCHA key: Missing
    SQL注入之DVWA平台测试mysql注入
    DVWA之SQL注入演练(low)
    浅谈CSRF攻击方式
    WAMPSERVER-服务器离线无法切换到在线状态问题的解决
    SQL注入攻击和防御
    WebScarab安装
    Intellij idea 自动完成的变量名称首字母变为小写
    在IDEA中代码自动提示第一个字母大小写必须匹配的解决
  • 原文地址:https://www.cnblogs.com/yujian-bcq/p/4791114.html
Copyright © 2020-2023  润新知