android WebView(五)WebChromeClient


WebView诸如获取页面的title、响应js中的alert、获取页面的加载进度等都可以通过设置WebChromeClient来实现。
首先来看一下设置WebChromeClient的代码:
webchromeclient = new SelfWebChromeClient( progressBar);
webView.setWebChromeClient(webchromeclient);
SelfWebChromeClient继承自WebChromeClient :
class SelfWebChromeClient extends WebChromeClient {}

WebView获取页面title

需要继承并实现WebChromeClient的onReceivedTitle方法
		@Override
		public void onReceivedTitle(WebView view, String title) {
			titleText.setText(title);
		}
此方法返回了页面的title,你可以在此方法体内展示此title信息。

WebView获取页面的加载进度

需要继承并实现WebChromeClient的onProgressChanged方法

		@Override
		public void onProgressChanged(WebView view, int newProgress) {
			// 当WebView进度改变时更新窗口进
			if (progressbar.getVisibility() != View.VISIBLE&&newProgress != 100) {
					progressbar.setVisibility(View.VISIBLE);
			}
			progressbar.setProgress(newProgress);
			super.onProgressChanged(view, newProgress);
		}

此方法返回了页面加载的进度newProgress。

WebView响应js中的alert

加入你的html页面中调用了下面的js:
 alert("大家好");
这时候需要如何来处理呢?WebChromeClient提供了回调方法onJsAlert,继承并实现此方法,在此方法体中做你想做的事,例如:
	@Override
		public boolean onJsAlert(WebView view, String url, String message,
				final JsResult result) {
			// 构建一个Builder来显示网页中的alert对话框
			Builder builder = new Builder(TestWebActivity.this);
			builder.setTitle("alert对话框");
			builder.setMessage(message);
			builder.setPositiveButton(android.R.string.ok,
					new AlertDialog.OnClickListener() {
						@Override
						public void onClick(DialogInterface dialog, int which) {
							result.confirm();
						}
					});
			builder.setCancelable(false);
			builder.create();
			builder.show();
			return true;
		}

还有诸如onJsConfirm之类的方法同理。

WebView播放视频

WebView要想播放视频,需要注意几点:
1、最好设置WebChromeClient。要不然很可能使你的视频框无法加载成功。
2、在Menifest中设置:android:layerType="software"   android:hardwareAccelerated="true"。要不然很可能使你的视频框无法加载成功。
3、在Menifest中设置:  <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16" />。这两个值一个要足够大,一个要足够小,要不然你的视屏可能只有声音没有
影像,另外全屏时横竖屏切换也需要设置一个合适版本号。我给的是我试过能正常运行的参数,其他的参数能不能行就不晓得了。
4、最好基于Android3.2的sdk开发。

WebView全屏播放需要如下实现WebChromeClient,当点击页面的全屏按钮时会触发onShowCustomView方法,在此方法中捕获视频组件放置到适当的地方去实现你的全屏播放:
private View customView;
	class SelfWebChromeClient extends WebChromeClient {
		private Bitmap defaltvideo;
		private ProgressBar progressbar;
		private CustomViewCallback myCallback = null;


		public SelfWebChromeClient( ProgressBar progressbar) {
			super();
			this.progressbar = progressbar;
		}


		@Override
		public void onShowCustomView(View view, CustomViewCallback callback) {
			if (myCallback != null) {
				myCallback.onCustomViewHidden();
				myCallback = null;
				return;
			}
			setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
			ViewGroup parent = (ViewGroup) webView.getParent();
			parent.removeView(webView);
			parent.addView(view);
			webviewFrame.addView(webView);
			customView = view;
			myCallback = callback;
		}


		public void onHideCustomView() {
			if (customView != null) {
				if (myCallback != null) {
					myCallback.onCustomViewHidden();
					myCallback = null;
				}
				try {
					setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
					ViewParent pat = customView.getParent();
					ViewGroup parent = (ViewGroup) pat;
					parent.removeView(customView);
					webviewFrame.removeAllViews();
					parent.addView(webView);
					customView = null;
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}


		// 视频加载添加默认图标
		@Override
		public Bitmap getDefaultVideoPoster() {
			System.out.println("getDefaultVideoPoster-->>");
			if (defaltvideo == null) {
				defaltvideo = BitmapFactory.decodeResource(getResources(),
						R.drawable.ic_launcher);
			}
			return defaltvideo;
		}


		// 视频加载时进程loading
		@Override
		public View getVideoLoadingProgressView() {
			System.out.println("getVideoLoadingProgressView-->>");
			ProgressBar progressbar = new ProgressBar(TestWebActivity.this, null,
					android.R.attr.progressBarStyleHorizontal);
			progressbar.setLayoutParams(new AbsoluteLayout.LayoutParams(
					LayoutParams.FILL_PARENT, 3, 0, 0));
			return progressbar;
		}


	}

回复小屏播放的代码如下:
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			if (customView != null) {
				webchromeclient.onHideCustomView();
				return true;
			} else {
				if (webView.canGoBack()) {
					webView.goBack();
					return true;
				} else {
					finish();
				}
			}
		}
		return false;
	}

对于退出后还是有视屏播放的声音的问题,有的人说退出是执行:webView.loadUrl("about:blank")。但是我的测试效果不是很好,建议添加如下代码解决:
@Override
	protected void onResume() {
		// LogActs.i("onResume-->>");
		try {
			webView.getClass().getMethod("onResume")
					.invoke(webView, (Object[]) null);
		} catch (Exception e) {
			e.printStackTrace();
		}
		super.onResume();
	}


	@Override
	protected void onStop() {
		try {
			webView.getClass().getMethod("onPause")
					.invoke(webView, (Object[]) null);
		} catch (Exception e) {
			e.printStackTrace();
		}
		// webView.loadUrl("about:blank");
		super.onStop();
	}






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值