原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/Android/2019/0727/584.html
配置cookie、post要求、滑动监听、点击监听、关闭音频视频
mWbRealize.loadUrl("http://www.homeqin.com/s/vknb0n8W?eqrcode=1&from=singlemessage&isappinstalled=0");
//支持javascript
web.getSettings().setJavaScriptEnabled(true);
// 配置可以支持缩放
web.getSettings().setSupportZoom(true);
// 配置出现缩下班具
web.getSettings().setBuiltInZoomControls(true);
//扩大比例的缩放
web.getSettings().setUseWideViewPort(true);//让webview读取网页配置的viewport,pc版网页
//自适应屏幕
web.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);//适应屏幕,内容将自动缩放
webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS);//适应内容大小
web.getSettings().setLoadWithOverviewMode(true);
settings.setDomStorageEnabled(true);//翻开DOM储存API
settings.setBlockNetworkImage(true);//阻挡图片的加载
web.setInitialScale(25);//为25%,非常小缩放品级
// 配置缓存模式:不应用缓存
mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
// 配置启动缓存
webView.getSettings().setDefaultTextEncodingName("utf-8");
webView.getSettings().setAppCacheEnabled(true);
webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
postUrl
//必要走访的网址
String url = "http://www.cqjg.gov.cn/netcar/FindThree.aspx";
//post走访必要提交的参数
String postDate = "txtName=zzz&QueryTypeLst=1&CertificateTxt=dsds";
//因为webView.postUrl(url, postData)中 postData范例为byte[] ,
//通过EncodingUtils.getBytes(data, charset)要领进行转换
webView.postUrl(url, EncodingUtils.getBytes(postDate, "UTF-8"));
EncodingUtils是 HttpCore内部的,要加依附
compile 'org.apache.httpcomponents:httpcore:4.4.4'
网页只加载出一片面,下面就不加载了?
● I/chromium(27693): [INFO:CONSOLE(8)] “Uncaught TypeError: Cannot call method ‘getItem’ of null”, source: url
网页加载不实现并报出如上错误时,有不妨你的DOM储存API没有翻开,在代码中加上一行:
mWebView.getSettings().setDomStorageEnabled(true);
要是有望点击链接由本人处分,而不是新开Android的体系browser中相应该链接。给WebView加一个事件监听工具(WebViewClient)并重写此中的少许要领:shouldOverrideUrlLoading:对网页中超链接按钮的相应。当按下某个持续时WebViewClient会挪用这个要领,并传递参数:按下的url。
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url); //在目前的webview中跳转到新的url
//要是不必要其余对点击链赴任件的处分回笼true,否则回笼false
return true;
}
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
if (url.startsWith("http") || url.startsWith("https")) { //http和https和谈开首的执行平常的流程
return super.shouldInterceptRequest(view, url);
} else { //其余的URL则会开启一个Acitity而后去挪用原生APP
if (url.contains("mqqwpa")){
if (OthersUtil.isQQClientAvailable(mContext)){
Intent in = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(in);
return null;
}else {
// Toast.makeText(mContext, "您的手机未安置手机QQ", Toast.LENGTH_SHORT).show();
// return super.shouldInterceptRequest(view, url);
return null;
}
}
Intent in = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(in);
return null;
}
}
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
// showErrorPage();//显示错误页面
hideErrorPage();
};
public void onPageFinished(WebView view, String url) {//处分网页加载胜利时
// loading_over.setVisibility(View.GONE);
// hideErrorPage();
}
//监听webview界面切换
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
if (url.contains("https://www.hzjr.com/Mobile/Index/customer?token=")){
mCloseService.setVisibility(View.GONE);
}
}
});
加载html标签
mWebView.loadDataWithBaseURL(null, stringHtml, "text/html", "utf-8", null);
onReceivedError 不行捕获腐朽的回调???
onReceivedError 有两个重载的要领,要重写第二个
1、public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
2、 public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
setWebChromeClient
setWebChromeClient主要处分剖判,渲染网页等涉猎器做的工作
WebChromeClient是辅助WebView处分Javascript的对话框,网站图标,网站title,加载进度等
onCloseWindow(关闭WebView)
onCreateWindow()
onJsAlert (WebView上alert不行弹出来的,要WebChromeClient处分)
onJsPrompt
onJsConfirm
onProgressChanged
onReceivedIcon
onReceivedTitle
setWebViewClient
WebViewClient是赞助WebView处分种种关照、要求事件的
onLoadResource
onPageStart
onPageFinish
onReceiveError
onReceivedHttpAuthRequest
点击超链接启动QQ
mWebView = (ProgressWebView) findViewById(R.id.baseweb_webview); mWebView.getSettings().setJavaScriptEnabled(true); String url ="http://wpa.qq.com/msgrd?v=3&uin=748895431&site=qq&menu=yes"; mWebView.loadUrl(url); mWebView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url); return true;
}
@Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
if (url.startsWith("http") || url.startsWith("https")) {
//http和https和谈开首的执行平常的流程 return super.shouldInterceptRequest(view, url);
} else {
//其余的URL则会开启一个Acitity而后去挪用原生APP Intent in = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(in); return null;
}
}
});
滑动监听
自定义webview重写onScrollChanged要领,行使接口回调
public class HzjrWebView extends WebView {
private OnScrollChangedCallback mOnScrollChangedCallback;
public HzjrWebView(Context context) {
super(context);
}
public HzjrWebView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public HzjrWebView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onScrollChanged(final int l, final int t, final int oldl,
final int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (mOnScrollChangedCallback != null) {
mOnScrollChangedCallback.onScroll(l , oldl, t , oldt);
}
}
// public OnScrollChangedCallback getOnScrollChangedCallback() {
// return mOnScrollChangedCallback;
// }
public void setOnScrollChangedCallback(
final OnScrollChangedCallback onScrollChangedCallback) {
mOnScrollChangedCallback = onScrollChangedCallback;
}
/**
* Impliment in the activity/fragment/view that you want to listen to the webview
*/
public interface OnScrollChangedCallback {
void onScroll(int l,int oldl,int t, int oldt);
}
}
页面关闭以后,视频大概音频还在播放的题目
要领1:
挪用
webView.loadUrl("about:blank");
这个要领会 销毁所有的video和audio 包含js的所有正在运转的function
要领2:
@Override
public void onPause() {
super.onPause();
myWebView.onPause();
myWebView.pauseTimers();
}
@Override
public void onResume() {
super.onResume();
myWebView.resumeTimers();
myWebView.onResume();
}
@Override
protected void onDestroy() {
myWebView.destroy();
myWebView = null;
super.onDestroy();
}
复写性命周期的要领;非常好的要领;(偶然会挂 java.lang.IllegalArgumentException: Receiver not registered: android.widget.ZoomButtonsController$1@3ed4bcc7)
要在销毁以前把根结构的所有子结构remove
mLlH5.removeAllViews();
回退时回到上一个页面,而不是退出WebView
mWebView.goBack(); //后退
mWebView.goForward();//进步
mWebView.reload(); //革新
public class MainActivity extends Activity {
private WebView webview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//2、在Activity中实例化WebView
setContentView(R.layout.activity_main);
webview = (WebView) findViewById(R.id.webview);
//第2步也能够替代为下面这两句,就不要R.layout.activity_main结构文件了
//mwebview = new WebView(this); //实例化WebView工具
//setContentView(mwebview);
// 配置WebView属性,能够执行Javascript剧本
webview.getSettings().setJavaScriptEnabled(true);
//3、 加载必要显示的网页
webview.loadUrl("http://www.baidu.com/");
///4、配置相应超链接,在安卓5.0体系,不应用下面语句超链接也是平常的,但在MIUI中安卓4.4.4中必要应用下面这条语句,才气相应超链接
webview.setWebViewClient(new HelloWebViewClient());
}
@Override
// 配置回退
// 5、笼盖Activity类的onKeyDown(int keyCoder,KeyEvent event)要领
public boolean onKeyDown(int keyCode, KeyEvent event) {
//按下回笼键而且webview界面可以回笼
if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {
webview.goBack(); // goBack()表示回笼WebView的上一页面
return true;
}
return super.onKeyDown(keyCode,event);
}
// Web视图
private class HelloWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
}
配置cookie
ATTENTION:
要在webView配置setting以后,loadUrl以前挪用此要领,否则失效
对于配置cookie失效的题目,在5.0以下可能会有失效的环境,sync是异步操纵。
失效的缘故是在removeSessionCookie以后立马setCookie可能会是配置以后又被清除了,可以加个延迟。
在5.0以上官方回调了同步要领。
具体先容参考博客:https://blog.csdn.net/b275518834/article/details/51004237
/**
* 给WebView同步Cookie
*
* @param context 高低文
* @param url 可以应用[domain][host]
*/
private void syncCookie(Context context, String url) {
CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
// cookieManager.removeSessionCookie();// 移除旧的[可以不祥]
cookieManager.setCookie(url,cookie);
CookieSyncManager.getInstance().sync();// To get instant sync instead of waiting for the timer to trigger, the host can call this.
}
另有权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
H5与Android交互
开始非常紧张非常轻易纰漏的网页权限
public class MainActivity extends AppCompatActivity {
/***************************************************************
* H5和Android通讯三种体例
* 1.android主动挪用js:javascript:要领名(参数)
* 2.js主动挪用Android
* 3.js callback式挪用Android,来源(解耦H5只关心H5,客户端只关心android)
* ***************************************************************
*/
private WebView mWebview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//配置webview
WebSettings settings = mWebview.getSettings();
settings.setJavaScriptEnabled(true);
//页面加载实现挪用js要领
//从新涉猎器内核工具
initWebClient();
//js和Android两种差别开发说话,不认识
//焦点要领:配置js和Android通讯桥梁接口(简而言之,即是配置通讯桥梁类)
JavascriptMethos jsMethos = new JavascriptMethos(this, mWebview);
//参数1:提供给js挪用的要领的工具, 参数2:参数1的映射字符串(第一个参数的又名),因为字符串再所有开发同样通用
mWebview.addJavascriptInterface(jsMethos, JavascriptMethos.JSINTERFACE);
//显示
mWebview.loadUrl("http:/10.0.3.2:8080/html35/index.html");
}
private void initWebClient() {
mWebview.setWebChromeClient(new WebChromeClient());
mWebview.setWebViewClient(new WebViewClient() {
@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);
//挪用js 要领
//WebView.loadUrl("javascript:要领名(参数)")
JSONObject json = new JSONObject();
try {
json.put("name", "android");
json.put("msg", "您好,我是Android,加个蚝友");
mWebview.loadUrl("javascript:receiveMessage("+json.toString()+")");
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
private void initView() {
mWebview = (WebView) findViewById(R.id.webview);
}
}
/**
* 同一经管所有js和Android通讯
*
*/
public class JavascriptMethos {
public static String JSINTERFACE = "jsInterface";
private Context mContext;
private WebView mWebView;
public JavascriptMethos(Context mContext, WebView mWebView) {
this.mContext = mContext;
this.mWebView = mWebView;
}
/**
* 给js挪用的弹出toast要领
* 为何要增加注解:android4.2以上(包含),要是不加注解,
* js无法挪用Android要领,因为4.2以前js和android通讯有安全题目,要是不加上该注解,4.2以上js无法挪用Android要领
*
* @param json
*/
@JavascriptInterface
public void showToast(String json) {
Toast.makeText(mContext, json, Toast.LENGTH_SHORT).show();
}
@JavascriptInterface
public void getHotelData(String json) throws JSONException {
//剖判callbak要领名
JSONObject jsJson = new JSONObject(json);
final String callback = jsJson.optString("callback");
System.out.println("汲取到js传递callback参数=" + json);
//模拟走访网页
//回笼json
final JSONObject callbackJson = new JSONObject();
try {
callbackJson.put("name", "8天连锁旅店");
callbackJson.put("hotel", "99");
callbackJson.put("phone", "075588888888");
//挪用js要领
//mWebView.loadUrl("javascript:要领名(参数)");默认Android挪用js自力运转在一个历程WebViewCoreThread
mHandler.post(new Runnable() {
@Override
public void run() {
//mWebView.loadUrl("javascript:receiveHotelData(" + callbackJson.toString() + ")");
mWebView.loadUrl("javascript:"+callback+"(" + callbackJson.toString() + ")");
}
});
} catch (JSONException e) {
e.printStackTrace();
}
}
private Handler mHandler = new Handler();
}
demo
https://github.com/jiaweizeng/H5AndAndroid
control是java工具称号,toastMessage是要领称号,两边约定俗成,写死。
<body>
<button type="button" id="button" onclick="toastMessage('js挪用了android要领')">js走访android中要领</button>
<script>
function toastMessage(message) {
window.control.toastMessage(message)
}
</script>
</body>
public class MainActivity extends AppCompatActivity {
@SuppressLint({"JavascriptInterface", "AddJavascriptInterface", "SetJavaScriptEnabled"})
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView webView = findViewById(R.id.wv);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webView.loadUrl("http://192.168.1.38/hzjrH5/jiaohu.html");
//js走访android,定义接口
webView.addJavascriptInterface(this, "control");
}
@JavascriptInterface
public void toastMessage(String s){
Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
finish();
}
}
上篇:上一篇:Android WebView应用
下篇:下一篇:让你监控Android手机的notify栏