微信支付 无法拉起
微信支付官方文档 webview loader url 需要加入 Referer 做为header
//"商家参数格式有误"
if (!url.startsWith("https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?")) {
wxReferer = url;
}
if (url.startsWith("weixin://wap/pay?")) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
return true;
}
else if (url.startsWith("http:") || url.startsWith("https:"))
if (!TextUtils.isEmpty(wxReferer)) {
Map extraHeaders = new HashMap<>();
extraHeaders.put("Referer", wxReferer);
view.loadUrl(url, extraHeaders);
} else {
view.loadUrl(url);
}
}
onPageFinished 在4.4版本会被多次执行的问题
这里不多做赘述,直接参数作者说明 参考地址
关闭activity 视频不停止播放
请在activity 生命周期方法中 调用webview 相关的生命周期方法 webview.destroy()
Http与Https混合
Android 5.0上Webview默认不允许加载Http与Https混合,可以导致的效果就是图片资源无法加载
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//两者都可以
webSetting.setMixedContentMode(webSetting.getMixedContentMode());
//webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
MIXED 描述
MIXED_CONTENT_ALWAYS_ALLOW 允许从任何来源加载内容,即使起源是不安全的;
MIXED_CONTENT_NEVER_ALLOW 不允许Https加载Http的内容,即不允许从安全的起源去加载一个不安全的资源
MIXED_CONTENT_COMPLTIBILITY_MODE 当涉及到混合式内容时,WebView会尝试去兼容最新Web浏览器的风格
证书受信
重写WebViewClient的onReceivedSslError方法在其中设置接受所有网站的证书
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view,SslErrorHandler handler, SslError error) {
//super.onReceivedSslError(view, handler, error);不要调用父类方法,否则设置无效。
// handler.cancel();// Android默认的处理方式
handler.proceed();// 接受所有网站的证书
}
});
302 和 未知情况处理
if (url.startsWith("http:") || url.startsWith("https:"))
WebView.HitTestResult hitTestResult = view.getHitTestResult();
if (hitTestResult == null) {
return false;
}
if (hitTestResult.getType() == WebView.HitTestResult.UNKNOWN_TYPE) {
return false;
}
}
HitTestResult 描述
WebView.HitTestResult.UNKNOWN_TYPE 未知类型
WebView.HitTestResult.PHONE_TYPE 电话类型
WebView.HitTestResult.EMAIL_TYPE 电子邮件类型
WebView.HitTestResult.GEO_TYPE 地图类型
WebView.HitTestResult.SRC_ANCHOR_TYPE 超链接类型
WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE 带有链接的图片类型
WebView.HitTestResult.IMAGE_TYPE 单纯的图片类型
WebView.HitTestResult.EDIT_TEXT_TYPE 选中的文字类型
webview 销毁
public void onDestroyView() {
try {
if (mWebView != null) {
mWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
// 如果先调用destroy()方法,则会命中if (isDestroyed()) return;这一行代码,需要先onDetachedFromWindow(),再
// destory()
ViewParent parent = mWebView.getParent();
if (parent != null) {
((ViewGroup) parent).removeView(mWebView);
}
mWebView.stopLoading();
// 退出时调用此方法,移除绑定的服务,否则某些特定系统会报错
mWebView.getSettings().setJavaScriptEnabled(false);
mWebView.clearHistory();
mWebView.clearView();
mWebView.removeAllViews();
mWebView.destroy();
mWebView = null;
}
} catch (Exception e) {
Log.e(TAG, "onDestroyView: ", e);
}
super.onDestroyView();
}
webview 执行JS Android 兼容问题 ,Webview卡死
WebViewCompat.java
import android.os.Build;
import android.text.TextUtils;
import android.webkit.ValueCallback;
import android.webkit.WebView;
public class WebViewCompat {
private static final String JAVASCRIPT = "javascript:";
/**
* @param view
* @param js
* @param v
*/
public static void evaluateJavascript(WebView view, String js, ValueCallback v) {
if (view == null) {
return;
}
if (TextUtils.isEmpty(js)) {
return;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
view.evaluateJavascript(js, v);
} else {
view.loadUrl(JAVASCRIPT + js);
}
}
/**
* @param view
* @param js
*/
public static void evaluateJavascript(WebView view, String js) {
evaluateJavascript(view, js, null);
}
}
###更多笔记请关注公众号,不定期更新###