package com.zenglb.baselib.base;
import android.content.DialogInterface;
import android.net.http.SslError;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.JsPromptResult;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import com.liaoinstan.springview.widget.SpringView;
import com.zenglb.baselib.jsbridge.BridgeImpl;
import com.zenglb.baselib.jsbridge.JSBridge;
import com.zenglb.commonlib.R;
/**
* 包含JSBridge 的WebView,不要写没有通用性的业务代码在这里
*/
public abstract class BaseWebViewActivity extends BaseActivity {
public static final String WEB_ACTION = "my.intent.action.GOTOWEB";
public static final String WEB_CATEGORY = "my.intent.category.WEB";
public static final String SCANQR_ACTION = "my.intent.action.GOSCANQR";
public static final String SCANQR_CATEGORY = "my.intent.category.SCANQR";
public final static int ZXING_REQUEST_CODE = 101; //扫码
public final static int GET_IMG_REQUEST_CODE = 102; //读取照片
public static final String URL = "url";//网页url
public static final String TITLE = "title";//标题内容
private WebView mWebView;
private ProgressBar topLoadingBar;
private SpringView springView;
protected String url;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle(R.string.web_base_title);
JSBridge.register(JSBridge.exposeClassName, BridgeImpl.class);
}
@Override
protected int setLayoutId() {
return R.layout.activity_jsbridge;
}
@Override
protected void initViews() {
topLoadingBar = (ProgressBar) findViewById(R.id.progress_bar);
mWebView = (WebView) findViewById(R.id.webview);
mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
//Android 4.4 开始,默认的浏览器已经是 chrome 了,所以 webview 也是 chrome 了,这就给了 webview 远程调试的能力。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
mWebView.setWebContentsDebuggingEnabled(true);
}
springView = (SpringView) findViewById(R.id.springview);
springView.setType(SpringView.Type.OVERLAP);
// TODO: 2017/3/17 还有冲突,滑动不行啊
springView.setListener(new SpringView.OnFreshListener() {
@Override
public void onRefresh() {
mWebView.loadUrl(url);
}
@Override
public void onLoadmore() {
}
});
WebSettings settings = mWebView.getSettings();
// //支持获取手势焦点,输入用户名、密码或其他
// mWebView.requestFocusFromTouch();
// settings.setRenderPriority(WebSettings.RenderPriority.HIGH); //提高渲染的优先级
//设置自适应屏幕,两者合用
// settings.setUseWideViewPort(true); //将图片调整到适合webview的大小
// settings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
//
// settings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。
// settings.setBuiltInZoomControls(true); //设置内置的缩放控件。
//若上面是false,则该WebView不可缩放,这个不管设置什么都不能缩放。
// settings.settingssetTextZoom(2);//设置文本的缩放倍数,默认为 100
// settings.setDisplayZoomControls(false); //隐藏原生的缩放控件
// setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); //支持内容重新布局
// supportMultipleWindows(); //多窗口
// setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //关闭webview中缓存
// setAllowFileAccess(true); //设置可以访问文件
// setNeedInitialFocus(true); //当webview调用requestFocus时为webview设置节点
// setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
// setLoadsImagesAutomatically(true); //支持自动加载图片
// setDefaultTextEncodingName("utf-8");//设置编码格式
// settings.setDefaultFontSize(20);//设置 WebView 字体的大小,默认大小为 16
// settings.setMinimumFontSize(12);//设置 WebView 支持的最小字体大小,默认为 8
settings.setJavaScriptEnabled(true);
//手动设置UA,让运营商劫持DNS的浏览器广告不生效 http://my.oschina.net/zxcholmes/blog/596192
settings.setUserAgentString("suijishu" + "#" + settings.getUserAgentString() + "01234560");
setWebViewClient();
setWebChromeClient();
System.gc();
}
/**
* @param url
*/
public void setURL(String url) {
mWebView.loadUrl(url);
}
private void setWebViewClient() {
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
final AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
String message = "SSL证书错误";
switch (error.getPrimaryError()) {
case SslError.SSL_UNTRUSTED:
message = "不是可信任的证书颁发机构。";
break;
case SslError.SSL_EXPIRED:
message = "证书已过期。";
break;
case SslError.SSL_IDMISMATCH:
message = "证书的主机名不匹配。";
break;
case SslError.SSL_NOTYETVALID:
message = "证书还没有生效。";
break;
}
message += " 你想要继续吗?";
builder.setTitle("SSL证书错误");
builder.setMessage(message);
builder.setPositiveButton("continue", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
handler.proceed();
}
});
builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
handler.cancel();
}
});
final AlertDialog dialog = builder.create();
dialog.show();
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
});
}
private void setWebChromeClient() {
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
String callBackData = JSBridge.callJavaNative(view, message);
result.confirm(callBackData);
return true;
}
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
getToolbar().setTitle(title);
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress == 100) {
topLoadingBar.setVisibility(View.INVISIBLE);
} else {
if (View.INVISIBLE == topLoadingBar.getVisibility()) {
topLoadingBar.setVisibility(View.VISIBLE);
}
topLoadingBar.setProgress(newProgress);
}
super.onProgressChanged(view, newProgress);
}
});
}
@Override
protected void onStart() {
super.onStart();
getToolbar().setSubtitle(mWebView.getUrl());
// getToolbar().setNavigationIcon(R.drawable.ic_launcher);
}
/**
* 允许webview 内部返回
*
* @param keyCode
* @param event
* @return
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
mWebView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
/**
* 结束后把Webview 所在的进程killed ,所有的手机都OK吗?没有测试哦
*
*/
@Override
public void onBackPressed() {
super.onBackPressed();
// android.os.Process.killProcess(android.os.Process.myPid());
// System.exit(0); //这样会不会好一点!
}
}