您的位置:首页 > 移动开发

webview相关资料

2016-09-09 16:48 295 查看
前言:如下内容是本人开发过程中记录的,没有顺序或者明显的分类,记录了webview使用到的场景,应该比较全了,有webview功能需求的朋友可以参考。

视频播放的实现:(使用系统原生的VideoView来实现)

1. 可以播放mp4格式的视频流,但需要下载完毕才能播放;另把mp4处理成m3u8格式的视频流,可以边下边播

2. 设置播放错误监听”videoView.setOnErrorListener“和开始播放监听“videoView.setOnPreparedListener”

//这个控件可以展示视频
videoView = (VideoView) findViewById(R.id.videoView);
videoView.setMediaController(new MediaController(this));//MediaController自带的控制条
//不需要丢到子线程处理,videoView内部已开线程
videoView.setVideoURI(Uri.parse(url));
videoView.start();//-------------->开始播视频
//视频播放过程中出现异常回调下面方法
videoView.setOnErrorListener(new OnErrorListener() {
@Override
public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
//出现异常了,执行下面两个步骤即可
videoView.setVideoURI(Uri.parse(url));
videoView.start();
return true;
}
});
//视频可以播放前会触发下面监听(该方法执行说明下一步就是播放视频了,所以这里需要关闭提示对话框)
videoView.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer arg0) {
Log.e("TAG", "---onPrepared---");
videoView.setBackgroundColor(Color.argb(0, 0, 255, 0));
dialog.hide();
}
});
videoView.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer arg0) {
Log.e("TAG", "---onCompletion---");
}
});


判断Activity屏幕方向:

// 如果是全屏状态 按返回键则变成非全屏状态,否则执行返回操作
if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
quitFullScreen();
} else {
if (webView.canGoBack()) {
webView.goBack();
} else {
finish();
}
}


关于WebView页面的点击事件:

貌似webView.setOnClickListener事件是无法触发的,我们可以通过自定义WebView类的onTouchEvent方法来处理手指下去和上来的事件,来模拟点击事件:

注意:如果WebView加载的页面也有点击事件,估计页面的事件不会执行(未测试)

1. 自定义WebView的子类:

public class MyWebView extends WebView {
private OnTouchScreenListener onTouchScreenListener;
public MyWebView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}

public MyWebView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public MyWebView(Context context) {
super(context);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (onTouchScreenListener != null)
onTouchScreenListener.onTouchScreen();
}
if (event.getAction() == MotionEvent.ACTION_UP) {
if (onTouchScreenListener != null)
onTouchScreenListener.onReleaseScreen();
}
return super.onTouchEvent(event);
}

public interface OnTouchScreenListener {
void onTouchScreen();
void onReleaseScreen();
}

public void setOnTouchScreenListener(OnTouchScreenListener onTouchScreenListener) {
this.onTouchScreenListener = onTouchScreenListener;
}
}
2. 使用时,模拟setOnClickListener
mWebView.setOnTouchScreenListener(new OnTouchScreenListener() {
@Override
public void onTouchScreen() {
}

@Override
public void onReleaseScreen() {
}
});


Android编程下WebView加载一个网页时获取该页面中Cookie里的值:

private class MyWebViewClient extends WebViewClient {

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

public void onPageFinished(WebView view, String url) {
CookieManager cookieManager = CookieManager.getInstance();//Cookie管理者实例
String CookieStr = cookieManager.getCookie(url);
Log.e("sunzn", "Cookies = " + CookieStr);
super.onPageFinished(view, url);
}

}


小结:实现的方案是在WebViewClient 的 onPageFinished(WebView view, String url) 方法中使用 CookieManager 来获取加载完成之后网页中携带的 Cookie 值

另:将cookie信息带入到webview中,之前总是出现有时cookie读取成功有时不成功,找了半天发现将cookieManager.removeSessionCookie();这句去掉就好了,暂时还没有出现什么问题,由于原来的web应用是采用session验证,所以在读取cookie成功后也将session信息写入,这样就双保险了

在WebView上显示HTML内容,包括英文以及中文。有3种方法可以有用:

(1)使用loadData方法。

这种方法需要先将HTML内容进行编码,否则显示的中文会有乱码。

编码方法为:

private String fmtString(String str){
String notice = "";
try{
notice = URLEncoder.encode(str, "utf-8");
}catch(UnsupportedEncodingException ex){
}
return notice;
}


调用fmtString方法:

mWebView.loadData(fmtString(notice1), "text/html", "utf-8");


notice1是自定义的HTML字符串,内容如下:

private String blank = "        ";
private String notice1 = "<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>" +
"<h3 align='center'>关于关闭电话银行语音系统查询动态密码功能的公告</h3></head>"
+ "<body>"
+ "<p align='center'><i>发布日期:2011-04-25</i>"
+ "</p><p>尊敬的客户:"
+ "</p><p>" + blank +
"根据优化电话银行相关服务功能的整体安排,我行决定自4月25日起,在95595电话银行语音系统中,停止受理查询手机动态密码功能。给您带来的不便之处敬请谅解。如有问题,请致电我行24小时服务热线95595。"
+ "</p><p>" + blank +
"感谢您长期以来对我行的关注、支持与厚爱!"
+ "</p><p>" + blank +
"特此公告。"
+ "</p><p align='right'>中国光大银行"
+ "</p><p align='right'>2011年4月25日</p></body></html>";


(2)使用loadDataWithBaseURL方法。

使用这个方法不需要先将HTML内容进行转码,直接可以显示:

mWebView.loadDataWithBaseURL("about:blank", notice1, "text/html", "utf-8", null);


(3)使用loadUrl方法。

使用这个方法的参数可以是网络上的某个网址,例如

mWebView.loadUrl("http://www.baidu.com");


也可以是本地的某个文件。这个文件必须存放在assets目录下面:

mWebView.loadUrl("file:///android_asset/notice01.html");


以上3种方法可以显示HTML内容在WebView上,但存有区别:

loadData方法显示的HTML都是居左对齐,不管align的值是left|center|right,结果都是居左对齐,并且显示中文的时候必须使用UrlEncoder进行编码。

loadDataWithBaseURL可以使用align属性,即可居左|居中|居右对齐,显示中文不需要UrlEncoder进行编码。

loadUrl显示的内容来自网络上或本地的某个问题。

以上就是全部内容,大家可以自个去试试,喜欢的朋友可以加个关注,以后有好的文章可以及时查阅讨论,有什么问题也可以留言,或者在微信公众号“技术帮团队”上找我们。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  webview