Android中的webview详细使用

原创 2015年11月06日 21:39:18


webview向html传递参数



方式一  通过 cookie传参

			CookieSyncManager.createInstance(this);
			CookieManager cookieManager = CookieManager.getInstance();
			cookieManager.setAcceptCookie(true);
			cookieManager.setCookie(mNewsUrl, "uid=" + uid);
			cookieManager.setCookie(mNewsUrl, "imnewsId=" + id);
			CookieSyncManager.getInstance().sync();
		


这里是通过 cookie向html传递了uid  和 id 两个参数 

不过需要注意的是 在设置了 cookie后,webview的一些功能可能会无法正常使用

这里使用到的mNewsUrl 就是要传参的页面

方式二 通过js传参


mHomeHeadImageWebView.loadUrl("javascript: homeHeadeImageData('" + uid + "," + id + "')");


这里是通过调用html页面的方法homeHeadeImageData(String str);方法,向页面传递了 uid 和id 这两个参数 ,不过页面接收到的是一个字符串,这里使用,分隔开的,

这个方法在使用的时候 最好是在页面加载完成后再进行调用,以防页面加载的时候 ,出现页面还没有初始化这个方法,造成传参失败的结果


private class MyWebViewClient extends WebViewClient {


		@Override
		public boolean shouldOverrideUrlLoading(WebView view, String url) {
			mHomeHeadImageWebView.loadUrl(url);
			return true;
		}

		@Override
		public void onPageStarted(WebView view, String url, Bitmap favicon) {
			super.onPageStarted(view, url, favicon);
			

		}

		@Override
		public void onPageFinished(WebView view, String url) {
			super.onPageFinished(view, url);
			HDLoadingFragmentDialog.hide();
			/**
			 * 向页面传
			 */
			mHomeHeadImageWebView.loadUrl("javascript: homeHeadeImageData('" + uid + "," + id + "')");

			
		}

		@Override
		public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
			

		}
	}

	

 然后webView中进行使用
mHomeHeadImageWebView.setWebViewClient(new MyWebViewClient());




html与java通信,调用java中的方法



// 添加js交互接口类,并起别名 imagelistner
		mHomeHeadImageWebView.addJavascriptInterface(new ClinicalInterface(this), "clinicalQuestRestul");


// js通信接口
	public class ClinicalInterface {
		private Context context;

		public ClinicalInterface(Context context) {
			this.context = context;
		}

	
		@JavascriptInterface
		public void upLoadClinicalImage(final String deId, final String list) {

			handler.post(new Runnable() {
				@Override
				public void run() {
					
				}
			});

		}
}

1. ClinicalInterface  是html通信调用的接口,html调用的方法全部在里面定义 

2. 在ClinicalInterface  通信接口中调用的方法 在android4.2版本以上,必须添加注解 @JavascriptInterface 才可以生效,否则页面是无法调用这个方法的

3. 本例中的upLoadClinicalImage方法 是页面要调用 的方法,并且传递两个参数过来

4. 页面要调用此接口,使用的对象 是 别名 clinicalQuestRestul



webView加载的时候控制 控制台上面的输出内容



               /**
		 * 控制在控制台上面输出的信息
		 */
		mHomeHeadImageWebView.setWebChromeClient(new WebChromeClient() {
			@Override
			public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
				return true;
			}

			@Override
			public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
				Log.d("clinical ", consoleMessage.message() + "from line" + consoleMessage.lineNumber() + "of"
						+ consoleMessage.sourceId());
				return true;
			}
		});




设置webview的缓存数据 




	protected void initCommonFouncation(boolean b) {
		
		// 设置缓存的大小
		mHomeHeadImageWebView.getSettings().setAppCacheMaxSize(1024 * 10);
		//  设置缓存模式
		// 建议缓存策略为,判断是否有网络,有的话,使用LOAD_DEFAULT,无网络时,使用LOAD_CACHE_ELSE_NETWORK。

		if (isnetWork()) {
			mHomeHeadImageWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);// 优先使用缓存
		} else {
			mHomeHeadImageWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
		}

		String cacheDirPath = getFilesDir().getAbsolutePath() + APP_CACAHE_DIRNAME;
		// String cacheDirPath =
		// getCacheDir().getAbsolutePath()+Constant.APP_DB_DIRNAME;
		// 设置数据库缓存路径
		mHomeHeadImageWebView.getSettings().setDatabasePath(cacheDirPath);
		// 设置 Application Caches 缓存目录
		mHomeHeadImageWebView.getSettings().setAppCachePath(cacheDirPath);
		// 开启 Application Caches 功能
		mHomeHeadImageWebView.getSettings().setAppCacheEnabled(true);

		mHomeHeadImageWebView.loadUrl(mNewsUrl);

	}


清除webview的缓存缓存数据



      public void clerWebviewCache() {
		if (mHomeHeadImageWebView != null) {
			mHomeHeadImageWebView.clearCache(true);
			mHomeHeadImageWebView.clearHistory();
			mHomeHeadImageWebView.clearFormData();
		}
	}

	/**
	 * 清除WebView缓存
	 */
	public void clearWebViewCache() {

		// 清理Webview缓存数据库
		try {
			deleteDatabase("webview.db");
			deleteDatabase("webviewCache.db");
		} catch (Exception e) {
			e.printStackTrace();
		}

		// WebView 缓存文件
		File appCacheDir = new File(getFilesDir().getAbsolutePath() + APP_CACAHE_DIRNAME);

		File webviewCacheDir = new File(getCacheDir().getAbsolutePath() + "/webviewCache");

		// 删除webview 缓存目录
		if (webviewCacheDir.exists()) {
			deleteFile(webviewCacheDir);
		}
		// 删除webview 缓存 缓存目录
		if (appCacheDir.exists()) {
			deleteFile(appCacheDir);
		}
	}

	/**
	 * 递归删除 文件/文件夹
	 * 
	 * @param file
	 */
	public void deleteFile(File file) {

		if (file.exists()) {
			if (file.isFile()) {
				file.delete();
			} else if (file.isDirectory()) {
				File files[] = file.listFiles();
				for (int i = 0; i < files.length; i++) {
					deleteFile(files[i]);
				}
			}
			file.delete();
		} else {
		}
	}










package com.administrator.interviewsummary;

import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Bundle;
import android.os.Message;
import android.view.InputEvent;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.webkit.ClientCertRequest;
import android.webkit.HttpAuthHandler;
import android.webkit.JsResult;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

/***
 * webview是基于webkit内核,它的运行效果与firefox上的一模一样
 * webview与js的双向交互才是android中的webview功能强大所在
 */
public class MainActivity extends Activity {

    private WebView webview ;
    private ProgressDialog mProgressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //去掉标题栏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        //实例化WebView对象
        webview = (WebView) findViewById(R.id.webview);
        //设置WebView属性,能够执行Javascript脚本
        WebSettings settings = webview.getSettings();
        //支持js脚本
        settings.setJavaScriptEnabled(true);
        //设置启动缓存
        settings.setAppCacheEnabled(true);
        //设置缓存的大小
        settings.setAppCacheMaxSize(1024 * 10);
        //设置缓存模式
        settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);//优先使用缓存
        settings.setCacheMode(WebSettings.LOAD_NO_CACHE);//不使用缓存

        //设置缓存,离线应用
        settings.setAppCacheEnabled(true) ;
        settings.setAppCacheMaxSize(1024 * 1024 * 8);
        settings.setCacheMode(WebSettings.LOAD_DEFAULT);



        //设置可以自动加载图片
        settings.setLoadsImagesAutomatically(true);
        //设置可以访问文件
        settings.setAllowFileAccess(true);
        //设置图片调整到适合webView的方法
       settings.setUseWideViewPort(false);
        //设置支持多窗口的
        settings.setSupportMultipleWindows(true);
        //支持缩放,设置成拖动放大缩小
        settings.setSupportZoom(true );
        settings.setBuiltInZoomControls(true) ;
        //支持内容从新布局
        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);

        //加载需要显示的网页
        webview.loadUrl("http://www.baidu.com/");
        //加载本地的html
        //webview.loadUrl("file:///android_asset/example.html");

        //点击链接留在当前的webview中进行数据的显示,而不是跳转到新的页面,重写这个方法
        webview.setWebViewClient(new WebViewClient() {
            //请求的是链接,当返回的是true时候,打开新的链接不会跳转到浏览器那边
            //返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                // return super.shouldOverrideUrlLoading(view, url);
                webview.loadUrl(url);
                return true;
            }

            //当开始载入页面的时候调用
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                //显示正在加载中的对话框
                mProgressDialog.show();
            }

            //当一个页面加载完成时候调用
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                //隐藏正在加载的圣诞框的提示信息
                mProgressDialog.dismiss();

            }

            //加载页面资源会调用,每加载一次就会调用一次
            @Override
            public void onLoadResource(WebView view, String url) {
                super.onLoadResource(view, url);
            }

            @Override
            public void onPageCommitVisible(WebView view, String url) {
                super.onPageCommitVisible(view, url);
            }

            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
                return super.shouldInterceptRequest(view, url);
            }

            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                return super.shouldInterceptRequest(view, request);
            }

            @Override
            public void onTooManyRedirects(WebView view, Message cancelMsg, Message continueMsg) {
                super.onTooManyRedirects(view, cancelMsg, continueMsg);
            }

            //报告错误
            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                super.onReceivedError(view, errorCode, description, failingUrl);
            }

            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);
            }

            @Override
            public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
                super.onReceivedHttpError(view, request, errorResponse);
            }

            //应用程序重新请求网页数据
            @Override
            public void onFormResubmission(WebView view, Message dontResend, Message resend) {
                super.onFormResubmission(view, dontResend, resend);
            }

            //更新历史记录
            @Override
            public void doUpdateVisitedHistory(WebView view, String url, boolean isReload) {
                super.doUpdateVisitedHistory(view, url, isReload);
            }

            //重写此方法,可以让webview执行https请求
            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                super.onReceivedSslError(view, handler, error);
            }

            @Override
            public void onReceivedClientCertRequest(WebView view, ClientCertRequest request) {
                super.onReceivedClientCertRequest(view, request);
            }

            //返回信息授权请求
            @Override
            public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
                super.onReceivedHttpAuthRequest(view, handler, host, realm);
            }

            //重写此方法才可以处理浏览器中的按键事件
            @Override
            public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
                return super.shouldOverrideKeyEvent(view, event);
            }

            //当key事件未被加载的时候调用
            @Override
            public void onUnhandledKeyEvent(WebView view, KeyEvent event) {
                super.onUnhandledKeyEvent(view, event);
            }

            @Override
            public void onUnhandledInputEvent(WebView view, InputEvent event) {
                super.onUnhandledInputEvent(view, event);
            }

            //当webview发生改变的时候调用这个方法
            @Override
            public void onScaleChanged(WebView view, float oldScale, float newScale) {
                super.onScaleChanged(view, oldScale, newScale);
            }

            @Override
            public void onReceivedLoginRequest(WebView view, String realm, String account, String args) {
                super.onReceivedLoginRequest(view, realm, account, args);
            }
        });
        //设置webview中可以输入text
        webview.requestFocus();
        //设置Web视图


        //获取网页对话框
        webview.setWebChromeClient(new WebChromeClient() {
            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                 //构建一个来显示网页中的对话框
                return true;
            }

            @Override
            public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
                 return true;
            }

            //加载进度
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                 super.onProgressChanged(view,newProgress);
            }
        }) ;


        mProgressDialog = ProgressDialog.show(this, "请稍后", "页面正在加载中");

        //webview获取焦点
        webview.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                webview.requestFocus();
                return false;
            }
        }) ;


    }

    @Override
    //设置回退
    //覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {
            webview.goBack(); //goBack()表示返回WebView的上一页面
            return true;
        }
        return false;
    }

    //Web视图
    private class HelloWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }







}



加载html时,通过cookie进行数据传递


        if (userinfo != null) {

			CookieSyncManager.createInstance(this);
			CookieManager cookieManager = CookieManager.getInstance();
			cookieManager.setAcceptCookie(true);
			cookieManager.setCookie(mNewsUrl, "uid=" + uid);
			cookieManager.setCookie(mNewsUrl, "id=" + id);
			CookieSyncManager.getInstance().sync();
		}


清除webview的缓存 


public void clerWebviewCache(){
		if (mHomeHeadImageWebView != null) {
			mHomeHeadImageWebView.clearCache(true);
			mHomeHeadImageWebView.clearHistory();
			mHomeHeadImageWebView.clearFormData();
		}
	}





版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zl18603543572/article/details/49688105

webview onReceivedError 接收不到404

在android里面加入webview的时候,有时候需要捕获http error,例如404等错误。在api 22 以下 系统提供onReceivedError方法。根据google官网提供的文档,o...
  • rnZuoZuo
  • rnZuoZuo
  • 2016-03-21 14:57:17
  • 7123

完美解决Android的WebView加载失败(404,500),显示的自定义视图

完美解决Android的WebView加载失败(404,500),显示的自定义视图好多朋友会在Android开发过程中遇到使用WebView加载html页面出现404,500等错误页面,也有好多人想自...
  • qq_20538515
  • qq_20538515
  • 2016-04-05 14:53:05
  • 14285

webview的自定义SSL认证配置(p12证书)

因为网页中要用到自定义SSL证书,而且密钥是 xxx.p12, 我们是将密钥转化为byte[]的形式传进来的,传入密码,这样来处理SSL 关键在onReceivedClientCertRequest...
  • zoeice
  • zoeice
  • 2013-11-01 10:01:55
  • 6564

招商银行支付时WebView无法加载证书

招商银行支付时WebView无法加ssl载证书
  • huyuchaoheaven
  • huyuchaoheaven
  • 2015-10-10 18:33:57
  • 2381

android4.0以上webview加载SSl证书兼容性问题

下面参考了其他博客获取证书。 public class AppConfig { private static WebView mWebView; public static X509Certi...
  • csh159
  • csh159
  • 2014-04-23 12:58:49
  • 7511

android2.1版本下android.webkit.WebView.getSettings的NullPointerException问题

在做腾讯微博的第三方登录的时候,由于要兼容2.2以下的版本,不得已使用了oauth2.0和oauth1两种授权机制来处理。要用oauth1,用http协议,只有自己定义webview了。但是在使用2....
  • yanbin1079415046
  • yanbin1079415046
  • 2012-12-05 19:10:47
  • 2193

Android 关于WebView全方面的使用

相关类介绍     ·          ·        WebResourceRequest ·        添加于API21,封装了一个Web资源的请求信息,包含:请求地址,请求方法,请求...
  • u011275280
  • u011275280
  • 2017-12-06 14:51:01
  • 246

Android WebView 开发详解(三)

介绍Android WebView 开发的WebSetting,详解settings当中困惑的地方以及对开发的提醒。并且分析Android 4.0以上版本针对WebSettings这一部分的具体实现。...
  • typename
  • typename
  • 2014-10-21 13:34:26
  • 22657

WebView加载网页失败以后

在APP和网页交互时,很有可能出现加载失败的情况。 为了不让用户看到上述令人崩溃的默认失败页面,这里进行一下简单处理!...
  • guchuanhang
  • guchuanhang
  • 2016-09-12 14:28:38
  • 6628

WebView获取当前网页的页面元素

今天简单总结一下,如何通过WebView来获取Html的页面元素。第一步,首先用WebView加载一个Html页面NSString *str=@&quot;http://.........&quot;...
  • wei78008023
  • wei78008023
  • 2016-03-13 01:55:23
  • 2221
收藏助手
不良信息举报
您举报文章:Android中的webview详细使用
举报原因:
原因补充:

(最多只允许输入30个字)