WebViewAcy给到
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Build;
import android.text.TextUtils;
import android.view.View;
import android.webkit.ConsoleMessage;
import android.webkit.JavascriptInterface;
import android.webkit.JsResult;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class WebViewActivity extends BaseActivity {
public WebView mWebView;
public WebSettings mWebSettings;
public String title, res;//res传递解密url
public TextView mTextView;
public ImageView mImageView;
public LoadingWindow loadingWindow;//加载dia
@Override
protected int getLayoutResId() {
return R.layout.activity_webview;
}
@Override
protected void initView() {
setColor();
StatusBarLightMode();
mWebView = getView(R.id.mWebView);
loadingWindow = new LoadingWindow(WebViewActivity.this, mWebView);
title = getIntent().getStringExtra("title");
mTextView = getView(R.id.center_TV);
mTextView.setText(title);
mImageView = getView(R.id.back_IMG);
mImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
res = getIntent().getStringExtra("res");
mWebSettings = mWebView.getSettings();
mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true);
/**
* Webview在安卓5.0之前默认允许其加载混合网络协议内容
* 在安卓5.0之后,默认不允许加载http与https混合内容,需要设置webview允许其加载混合网络协议内容
*/
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
mWebSettings = mWebView.getSettings();
mWebSettings.setSaveFormData(false); // 是否保存产生的数据
mWebSettings.setDomStorageEnabled(true);
mWebSettings.setAllowFileAccess(true);
mWebSettings.setAllowFileAccessFromFileURLs(false);
mWebSettings.setAllowUniversalAccessFromFileURLs(false);
mWebSettings.setJavaScriptEnabled(true); // 是否启用JAVA脚本
mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true);
mWebSettings.setSupportZoom(true);
mWebSettings.setBuiltInZoomControls(true); // 是否支持缩放
mWebSettings.setDisplayZoomControls(false);
mWebSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
mWebSettings.setUseWideViewPort(true);
mWebSettings.setLoadWithOverviewMode(true);
mWebView.setWebChromeClient(new WebViewActivity.MyWebChromeClient());
mWebView.requestFocusFromTouch();
//java回调js代码,不要忘了@JavascriptInterface这个注解,不然点击事件不起作用
mWebView.addJavascriptInterface(new JsCallJavaObj() {
@JavascriptInterface
@Override
public void toMyFragment() {
Intent login = new Intent(WebViewActivity.this, MainActivity.class);
login.putExtra("type", 3);
startActivity(login);
finish();
}
}, "app");
mWebView.setWebChromeClient(new WebChromeClient());//这行最好不要丢掉
//该方法解决的问题是打开浏览器不调用系统浏览器,直接用webview打开
mWebView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView mView, String url) {
mView.loadUrl(url);
return true;
}
@JavascriptInterface
@Override
public void onPageStarted(WebView view, String u, Bitmap favicon) {
super.onPageStarted(view, u, favicon);
loadingWindow.show();
}
@JavascriptInterface
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
//拦截上海银行回调url
//if (url.contains("returnurl/payreturn")) {
//注入一段js代码
String jsCode = "javascript: (function(){ " +
"var btn=document.getElementById('regist_n_submit');" +
"btn.onclick=function(){window.app.toMyFragment();} " +
"})()";
view.loadUrl(jsCode);
//}
loadingWindow.dismiss();
}
@JavascriptInterface
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
// super.onReceivedSslError(view, handler, error);//注意这个存在重定向url super方法中存在 默认不安全导致空白页面
handler.proceed();
// handleMessage(Message msg); 其他处理
}
});
if (!TextUtils.isEmpty(res)) {
mWebView.loadUrl(res);
}
}
// 解决html alert和conse打印不出来的问题
private class MyWebChromeClient extends WebChromeClient {
@Override
public boolean onConsoleMessage(ConsoleMessage cm) {
MsgUtil.e("test", cm.message() + " -- From line "
+ cm.lineNumber() + " of "
+ cm.sourceId());
return true;
}
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Toast.makeText(WebViewActivity.this, message, Toast.LENGTH_SHORT).show();
result.confirm();
//result.cancel();
return false;
}
}
private interface JsCallJavaObj {
void toMyFragment();
}
}
WebView调用setWebChromeClient 的几个方法注意的写在下面
1、Java回调js代码,不要忘了@JavascriptInterface这个注解,不然点击事件不起作用
2、在onPageFinished中调用JS的单击事件以及跳转应用的页面
3、onReceivedSslError方法中要注意的是 注释super(),里面对于重定向 安全页面 默认为不安全、
以上就是解决Android调用JS的一些方法。代码块中的基本都给到了,拿去就可以用。
纸上得来终觉浅,书到用时方恨少。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115042.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...