版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012246458/article/details/88656726
需求
这里放一个Android WebView的简单Demo,不过这个Demo是我这边特别精简的,能基本上适用于我这边大部分的页面显示和功能问题,多余的代码和配置都被我删掉了;
注释掉的代码是不同的情景模式,不做注释了。
代码
package zql.h5;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.webkit.JavascriptInterface;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
public static final String INTENT_URL = "intent_url";//请求连接
// public static final String INTENT_PARAMS_STRING = "intent_params_string";//请求参数字符串
// public static final String INTENT_REQUEST_WAY = "intent_request_way";//请求方式(POST/GET)
private WebView wvShow;
private TextView tv_back_title;
private TextView tv_title;
private ImageView iv_back;
private TextView tv_right;
public ValueCallback<Uri[]> uploadMessage;
private ValueCallback<Uri> mUploadMessage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏
setContentView(R.layout.activity_main);
tv_back_title = (TextView) findViewById(R.id.tv_back_title);
tv_title = (TextView) findViewById(R.id.tv_title);
iv_back = (ImageView) findViewById(R.id.iv_back);
tv_right = (TextView) findViewById(R.id.tv_right);
iv_back.setOnClickListener(this);
tv_back_title.setOnClickListener(this);
tv_right.setOnClickListener(this);
initView();
initData();
}
private void initData() {
// //外部:GET & POST形式
// String intentUrl = getIntent().getStringExtra(INTENT_URL);
// String intentParams = getIntent().getStringExtra(INTENT_PARAMS_STRING);
// String intentRequestWay = getIntent().getStringExtra(INTENT_REQUEST_WAY);
// Log.e("WebView请求", "连接:" + intentUrl + "....." + "参数:" + intentParams);
//
// if (intentRequestWay.equals("GET")) {
// wvShow.loadUrl(intentUrl + "?" + intentParams);//get请求
// } else if (intentRequestWay.equals("POST")) {
// wvShow.postUrl(intentUrl, intentParams.getBytes());//post请求
// } else {
// Toast.makeText(MainActivity.this, "请求方式参数错误", Toast.LENGTH_SHORT).show();
// }
//链接
wvShow.loadUrl("https://bht.mandao.com/front/#/v2/chb/payment/21ecf0bbe1ee4eb0a8027ff234e7e65c/ASSURE_PAY");//get请求
// //Html源码
// String htmlData = "<!DOCTYPE html>\n" +
// "<html>\n" +
// "<head>\n" +
// " <meta charset=\"utf-8\">\n" +
// " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no\">\n" +
// " <meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n" +
// " <meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\n" +
// " <title>修改资料</title>\n" +
// " <script src=\"./jquery-1.8.3.js\"></script>\n" +
// "</head>\n" +
// "\n" +
// "<body>\n" +
// " <div className=\"image-uploader\">\n" +
// " <input id=\"imgInput\" className=\"imgInput\" type=\"file\" accept=\"image/*\" />\n" +
// " <img id=\"imgShow\" className=\"imgShow\" />\n" +
// " </div>\n" +
// "\n" +
// "<script> \n" +
// " $('#imgInput').change(function () {\n" +
// " readURL(this);\n" +
// "});\n" +
// "\n" +
// "function readURL(input){\n" +
// " if (input.files && input.files[0]) {\n" +
// " const reader = new FileReader();\n" +
// " reader.readAsDataURL(input.files[0]);\n" +
// " reader.onload = (e) => {\n" +
// " $('#imgShow').attr('src', e.target.result);\n" +
// " };\n" +
// " };\n" +
// " };\n" +
// "</script>\n" +
// "</body>\n" +
// "</html>";
//
// Log.e("网页", htmlData);
//
// wvShow.loadDataWithBaseURL(null, htmlData, "text/html", "utf-8", null);
}
private void initView() {
wvShow = (WebView) findViewById(R.id.wv_body);
wvShow.getSettings().setJavaScriptEnabled(true);//允许与js 交互
wvShow.getSettings().setDefaultTextEncodingName("utf-8");//支持中文
wvShow.addJavascriptInterface(new JsInterface(this), "androidYZH");//在js中调用本地java方法(androidYZH这个是js和安卓之间的约定,js:window.androidYZH.closeH5)
wvShow.getSettings().setDomStorageEnabled(true);//允许缓存、开启DOM(双重重定向白屏问题)
wvShow.setWebViewClient(new WebViewClient() {
//覆盖shouldOverrideUrlLoading 方法
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url == null) return false;
try {
if (url.startsWith("http:") || url.startsWith("https:")) {
view.loadUrl(url);
return true;
} else {//如果不是http和https就用系统浏览器打开
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}
} catch (Exception e) { //防止crash (如果手机上没有安装处理某个scheme开头的url的APP, 会导致crash)
return false;
}
}
});
wvShow.setWebChromeClient(new WebChromeClient() {//监听网页加载
@Override
public void onProgressChanged(WebView view, int newProgress) {
// if (newProgress == 100) {
// // 网页加载完成
// pbProgress.setVisibility(View.GONE);
// } else {
// // 加载中
// pbProgress.setProgress(newProgress);
// }
super.onProgressChanged(view, newProgress);
}
});
}
@Override
public void onClick(View v) {
int i = v.getId();
if (i == R.id.iv_back) {
if (wvShow.canGoBack()) {
wvShow.goBack();
} else {
finish();
}
} else if (i == R.id.tv_back_title) {
finish();
}
}
/**
* js调用原生方法
*/
private class JsInterface {
private Context mContext;
public JsInterface(Context context) {
this.mContext = context;
}
@JavascriptInterface
public void closeH5(String name) {//关闭sdk
Log.e("网页", "方法入参:" + name);
finish();
}
@JavascriptInterface
public void downloadFile(String name) {//下载文件
Log.e("网页", "方法入参:" + name);
//这里是把地址用默认浏览器打开,在浏览器中下载
Uri uri = Uri.parse(name);
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.setData(uri);
startActivity(intent);
}
}
//重写Activity的onKeyDown事件,判断当用户按下“返回”按钮,webview返回上一页
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && wvShow.canGoBack()) {
wvShow.goBack();
return true;
} else {
finish();
}
return super.onKeyDown(keyCode, event);
}
}