在项目开发过程中,免不了要进行混合开发,也就是常见的web混合开发,记录一下项目中常用的部分代码。
- webSetting常见属性设置
mWebView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
//WebView属性设置!!!
WebSettings settings = mWebView.getSettings();
//设置加载js
settings.setJavaScriptEnabled(true);
settings.setAllowFileAccess(true);
settings.setCacheMode(WebSettings.LOAD_DEFAULT);
settings.setDomStorageEnabled(true);
settings.setUseWideViewPort(true);
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
settings.setLoadWithOverviewMode(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setDatabaseEnabled(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);
}
- webclient
mWebView.setWebChromeClient(new MyWebChromeClient());
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.i("网页拦截中加载的url:", url);
view.loadUrl(url);
return super.shouldOverrideUrlLoading(view, url);
}
@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);
}
});
class MyWebChromeClient extends WebChromeClient {
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress == 100) {
mProgressBar.setVisibility(View.GONE);
} else {
mProgressBar.setVisibility(View.VISIBLE);
mProgressBar.setProgress(newProgress);
}
}
@Override
public void onReceivedTitle(WebView view, String webtitle) {
super.onReceivedTitle(view, webtitle);
LogUtils.logi("网页标题:" + webtitle);
if (!TextUtils.isEmpty(webtitle)) {
mTitle.setTitle(false, null, webtitle);
} else {
mTitle.setTitle(false, null, "提现");
}
}
//Android 5.0 及以上 必须重写此方法
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
boolean fromCamera = fileChooserParams.isCaptureEnabled();
String[] acceptTypes = fileChooserParams.getAcceptTypes();
if (acceptTypes != null && acceptTypes.length > 0) {
boolean isImage = false;
for (String acceptType : acceptTypes) {
if (acceptType.contains("image")) {
isImage = true;
break;
}
}
if (isImage) {//处理图片
if (fromCamera) {//只处理拍照
if (captureImageFromCamera(WebViewActivity.this, imageUri)) {
WebViewActivity.this.filePathCallback = filePathCallback;//暂存,用于拍完照片后回调H5
return true;//返回true表示APP处理文件选择
}
}
}
boolean isVideo = false;
for (String acceptType : acceptTypes) {
if (acceptType.contains("video")) {
isVideo = true;
break;
}
}
if (isVideo) {//处理视频
if (fromCamera) {//只处理拍摄视频
if (captureVideoFromCamera(WebViewActivity.this, imageUri)) {
WebViewActivity.this.filePathCallback = filePathCallback;//暂存,用于拍摄完视频后回调H5
return true;//返回true表示APP处理文件选择
}
}
}
}
return super.onShowFileChooser(webView, filePathCallback, fileChooserParams);
}
//Android 5.0 以下 必须重写此方法
public void openFileChooser(final ValueCallback<Uri> uploadFile, String acceptType, String capture) {
LogUtils.loge("点击文件的类型是:" + acceptType);
boolean fromCamera = !TextUtils.isEmpty(capture);
if (acceptType != null && acceptType.contains("video")) {//处理视频
if (fromCamera) {//只处理拍摄视频
if (captureVideoFromCamera(WebViewActivity.this, imageUri)) {
WebViewActivity.this.uploadFile = uploadFile;//暂存,用于拍摄完视频后回调H5
return;
}
}
}
if (acceptType != null && acceptType.contains("image")) {//处理图片
if (fromCamera) {//只处理拍照
if (captureImageFromCamera(WebViewActivity.this, imageUri)) {
WebViewActivity.this.uploadFile = uploadFile;//暂存,用于拍完照片后回调H5
}
}
}
}
}
- js注入
为了偷个懒,方便方便webview的js操作,特意用了如下的第三方,目前在使用过程中还未发现大问题,by the way,ios也是通用的。
//webview jsbridge
implementation 'com.github.wendux:WebViewJavascriptBridge:master-SNAPSHOT'
compile('com.github.gzu-liyujiang.AndroidPicker:WheelPicker:1.5.6') {
exclude group: 'com.android.support'
}
mWebView.registerHandler("testObjcCallback", (WVJBWebView.WVJBHandler) (data, callback) -> {
callback.onResult(data);
Log.d("wvjsblog", "Java Echo called with: " + data.toString());
//此处处理data回调的结果
});
- 文件下载
/**
* 下载文件监听 跳转浏览器下载
*
* @param mWebView
*/
public static void addDownLoadListener(Activity activity, WVJBWebView mWebView) {
mWebView.setDownloadListener((url, userAgent, contentDisposition, mimetype, contentLength) -> {
if (!TextUtils.isEmpty(url)) {
downloadByBrowser(activity, url);
}
});
}
//跳转到外部浏览器进行下载
public static void downloadByBrowser(Activity activity, String url) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setData(Uri.parse(url));
activity.startActivity(intent);
}
- 加载的url历史堆栈信息(跨域的url)
这段代码主要是处理跨域后后到之前网页的历史浏览信息
/**
* 加载的url历史堆栈信息
*
* @param loadHistoryUrls:url数组信息
* @param mWebView
* @param activity
* @param isMain:是否为首页的tab页面
*/
public static void receiverGoBack(ArrayList<String> loadHistoryUrls, WVJBWebView mWebView, Activity activity, boolean isMain, ImageView imageView) {
//过滤是否为重定向后的链接
LogUtils.loge("网页拦截中加载的url历史堆栈信息:" + loadHistoryUrls.toString());
if (loadHistoryUrls.size() > 1 && !ConfigUtil.H5Pre.contains(loadHistoryUrls.get(loadHistoryUrls.size() - 1))) {
if (loadHistoryUrls.size() > 2) {
//移除加载栈中的最后两个链接
loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
}
if (loadHistoryUrls.size() > 1) {
//移除加载栈中的最后一个链接
loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
}
LogUtils.loge("拦截中后退的url历史记录" + loadHistoryUrls.toString());
//加载重定向之前的页
if (isMain) {
if (loadHistoryUrls.size() == 1) {
imageView.setVisibility(View.INVISIBLE);
}
}
mWebView.loadUrl(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
} else {
activity.finish();
}
}
public static void onPressGoBack(ArrayList<String> loadHistoryUrls, WVJBWebView mWebView, ImageView imageView, Activity activity) {
//过滤是否为重定向后的链接
LogUtils.loge("网页拦截中加载的url历史堆栈信息:" + loadHistoryUrls.toString());
if (loadHistoryUrls.size() > 1 && !ConfigUtil.H5Pre.contains(loadHistoryUrls.get(loadHistoryUrls.size() - 1))) {
if (loadHistoryUrls.size() > 2) {
//移除加载栈中的最后两个链接
loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
}
if (loadHistoryUrls.size() > 1) {
//移除加载栈中的最后一个链接
loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
}
LogUtils.loge("拦截中后退的url历史记录" + loadHistoryUrls.toString());
//加载重定向之前的页
if (loadHistoryUrls.size() == 1) {
imageView.setVisibility(View.INVISIBLE);
}
mWebView.loadUrl(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
} else {
if ((System.currentTimeMillis() - exitTime) > 2000) {
ToastUtil.showToast("再按一次退出程序");
exitTime = System.currentTimeMillis();
} else {
activity.finish();
}
}
}
多的就不说了,附带源码部分 WebUtils.java
public class WebUtils {
public static UMShareListener umShareListener = new UMShareListener() {
@Override
public void onStart(SHARE_MEDIA share_media) {
}
@Override
public void onResult(SHARE_MEDIA platform) {
ToastUtil.showToast("分享成功");
}
@Override
public void onError(SHARE_MEDIA platform, Throwable t) {
ToastUtil.showToast("分享失败");
}
@Override
public void onCancel(SHARE_MEDIA platform) {
}
};
private static long exitTime = 0;
public static void loadWebSetting(WVJBWebView mWebView) {
mWebView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
//WebView属性设置!!!
WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setAllowFileAccess(true);
settings.setCacheMode(WebSettings.LOAD_DEFAULT);
settings.setDomStorageEnabled(true);
settings.setUseWideViewPort(true);
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
settings.setLoadWithOverviewMode(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setDatabaseEnabled(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);
}
}
/**
* webview中注册的js方法
*
* @param activity
* @param mWebView
*/
public static void loadWebJsMethod(Activity activity, WVJBWebView mWebView) {
//分享功能
mWebView.registerHandler("testObjcCallback", (WVJBWebView.WVJBHandler) (data, callback) -> {
Log.d("wvjsblog", "Java Echo called with: " + data.toString());
callback.onResult(data);
Gson gson = new Gson();
if (data != null) {
ShareForWebBean bean1 = gson.fromJson(data.toString(), ShareForWebBean.class);
initShare(activity, bean1);
}
});
//返回首页
mWebView.registerHandler("backHome", (WVJBWebView.WVJBHandler) (data, callback) -> {
Log.d("wvjsblog", "Java Echo called with: " + data.toString());
callback.onResult(data);
ARouter.getInstance().build(RouterUtil.INDEXMAIN).withInt("pageFlag", 1).navigation();
activity.finish();
});
//提现页面
mWebView.registerHandler("profit", (WVJBWebView.WVJBHandler) (data, callback) -> {
Log.d("wvjsblog", "Java Echo called with: " + data.toString());
callback.onResult(data);
ARouter.getInstance().build(RouterUtil.WITHDRAW).withDouble("profit", Double.parseDouble(data.toString())).navigation();
});
//关闭webview页面
mWebView.registerHandler("finish", (WVJBWebView.WVJBHandler) (data, callback) -> {
Log.d("wvjsblog", "Java Echo called with: " + data.toString());
callback.onResult(data);
activity.finish();
});
// 查看还款记录
mWebView.registerHandler("repayrecord", (WVJBWebView.WVJBHandler) (data, callback) -> {
Log.d("wvjsblog", "Java Echo called with: " + data.toString());
callback.onResult(data);
ARouter.getInstance().build(RouterUtil.REPAYRECORD).navigation();
});
}
public static void initShare(Activity activity, ShareForWebBean bean) {
//wechat=微信,coterie=朋友圈,qq=QQ
SHARE_MEDIA share_media = SHARE_MEDIA.QQ;
if (!TextUtils.isEmpty(bean.getCode())) {
switch (bean.getCode()) {
case "wechat":
share_media = SHARE_MEDIA.WEIXIN;
break;
case "coterie":
share_media = SHARE_MEDIA.WEIXIN_CIRCLE;
break;
case "qq":
share_media = SHARE_MEDIA.QQ;
break;
}
}
String link = bean.getLink();
UMWeb web = new UMWeb(link);
web.setTitle(bean.getTitle());//标题
web.setThumb(new UMImage(activity, bean.getIcon())); //缩略图
web.setDescription(bean.getDesc());//描述
new ShareAction(activity)
.setPlatform(share_media)//传入平台
.withText(bean.getTitle())//分享内容
.withMedia(web)
.setCallback(umShareListener)//回调监听器
.share();
}
/**
* 下载文件监听 跳转浏览器下载
*
* @param mWebView
*/
public static void addDownLoadListener(Activity activity, WVJBWebView mWebView) {
mWebView.setDownloadListener((url, userAgent, contentDisposition, mimetype, contentLength) -> {
if (!TextUtils.isEmpty(url)) {
downloadByBrowser(activity, url);
}
});
}
public static void downloadByBrowser(Activity activity, String url) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
intent.setData(Uri.parse(url));
activity.startActivity(intent);
}
/**
* 加载的url历史堆栈信息
*
* @param loadHistoryUrls:url数组信息
* @param mWebView
* @param activity
* @param isMain:是否为首页的tab页面
*/
public static void receiverGoBack(ArrayList<String> loadHistoryUrls, WVJBWebView mWebView, Activity activity, boolean isMain, ImageView imageView) {
//过滤是否为重定向后的链接
LogUtils.loge("网页拦截中加载的url历史堆栈信息:" + loadHistoryUrls.toString());
if (loadHistoryUrls.size() > 1 && !ConfigUtil.H5Pre.contains(loadHistoryUrls.get(loadHistoryUrls.size() - 1))) {
if (loadHistoryUrls.size() > 2) {
//移除加载栈中的最后两个链接
loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
}
if (loadHistoryUrls.size() > 1) {
//移除加载栈中的最后一个链接
loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
}
LogUtils.loge("拦截中后退的url历史记录" + loadHistoryUrls.toString());
//加载重定向之前的页
if (isMain) {
if (loadHistoryUrls.size() == 1) {
imageView.setVisibility(View.INVISIBLE);
}
}
mWebView.loadUrl(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
} else {
activity.finish();
}
}
/**
* 清除历史消息
*
* @param mWebView
*/
public static void clearWebInfo(WVJBWebView mWebView) {
if (mWebView != null) {
mWebView.clearHistory();
mWebView.clearCache(true);
mWebView.destroy();
}
}
public static void onPressGoBack(ArrayList<String> loadHistoryUrls, WVJBWebView mWebView, ImageView imageView, Activity activity) {
//过滤是否为重定向后的链接
LogUtils.loge("网页拦截中加载的url历史堆栈信息:" + loadHistoryUrls.toString());
if (loadHistoryUrls.size() > 1 && !ConfigUtil.H5Pre.contains(loadHistoryUrls.get(loadHistoryUrls.size() - 1))) {
if (loadHistoryUrls.size() > 2) {
//移除加载栈中的最后两个链接
loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
}
if (loadHistoryUrls.size() > 1) {
//移除加载栈中的最后一个链接
loadHistoryUrls.remove(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
}
LogUtils.loge("拦截中后退的url历史记录" + loadHistoryUrls.toString());
//加载重定向之前的页
if (loadHistoryUrls.size() == 1) {
imageView.setVisibility(View.INVISIBLE);
}
mWebView.loadUrl(loadHistoryUrls.get(loadHistoryUrls.size() - 1));
} else {
if ((System.currentTimeMillis() - exitTime) > 2000) {
ToastUtil.showToast("再按一次退出程序");
exitTime = System.currentTimeMillis();
} else {
activity.finish();
}
}
}
public static Uri perImgUrl=null;
public static boolean captureImageFromCamera(Activity activity, Uri imageUri) {
File cacheDir = null;
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
cacheDir = activity.getExternalCacheDir();
}
if (cacheDir == null) {
cacheDir = activity.getCacheDir();
}
File outFile = new File(cacheDir, System.currentTimeMillis() + ".jpg");
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {//如果api大于Android api23 要替换获取文件Uri方式
//此方法第二个参数authority的值要用项目中的值来替换,可网上找Android 7.0 FileProvider相关介绍
imageUri = FileProvider.getUriForFile(activity, "com.chelizi.xhc.provider.fileprovider", outFile);
perImgUrl=imageUri;
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//加入flag
} else {
imageUri = Uri.fromFile(outFile);
perImgUrl=imageUri;
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
intent.addCategory(Intent.CATEGORY_DEFAULT);
}
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {//有相机权限
PackageManager packageManager = activity.getPackageManager();
if (intent.resolveActivity(packageManager) != null) {
try {
activity.startActivityForResult(intent, ConfigUtil.ActResultConstant.FILECHOOSER_RESULTCODE);
return true;
} catch (Exception e) {
e.printStackTrace();
}
}
} else {//没有相机权限
// TODO: 这里做请求相机权限的处理(网上找Android 6.0权限管理相关介绍)
ToastUtil.showToast("请开启相机权限");
}
return false;
}
public static Uri getImgeUrl(){
return perImgUrl;
}
/**
* 调用系统相机拍摄视频
*/
public static boolean captureVideoFromCamera(Activity activity, Uri imageUri) {
File cacheDir = null;
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
cacheDir = activity.getExternalCacheDir();
}
if (cacheDir == null) {
cacheDir = activity.getCacheDir();
}
File outFile = new File(cacheDir, System.currentTimeMillis() + ".mp4");
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {//如果api大于Android api23 要替换获取文件Uri方式
//此方法第二个参数authority的值要用项目中的值来替换,可网上找Android 7.0 FileProvider相关介绍
Uri uri = FileProvider.getUriForFile(activity, "com.chelizi.xhc.provider.fileprovider", outFile);
perImgUrl=imageUri;
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//加入flag
} else {
Uri uri = Uri.fromFile(outFile);
perImgUrl=imageUri;
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
intent.addCategory(Intent.CATEGORY_DEFAULT);
}
//调系统相机拍摄视频需要用到相机权限,先判断有没有这个权限
if (ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {//有相机权限
PackageManager packageManager = activity.getPackageManager();
if (intent.resolveActivity(packageManager) != null) {
try {
activity.startActivityForResult(intent, FILECHOOSER_VIDEO_RESULTCODE);
return true;
} catch (Exception e) {
e.printStackTrace();
}
}
} else {//没有相机权限
// TODO: 这里做请求相机权限的处理(网上找Android 6.0权限管理相关介绍)
ToastUtil.showToast("请开启相机权限");
}
return false;
}
}
Webview.java
@Route(path = RouterUtil.WEBVIEW)
public class WebViewActivity extends BaseActivity implements View.OnClickListener {
private final String AUTHTAG = "认证进度:";
@BindView(R.id.web_view)
WVJBWebView mWebView;
@BindView(R.id.tv_tag_content)
TextView mTvTagContent;
@BindView(R.id.dialog_view)
LinearLayout mDialogView;
@BindView(R.id.progressbar)
ProgressBar mProgressBar;
@Autowired(name = "url")
String url;
@Autowired(name = "title")
String title;
@Autowired(name = "applySuccess")
boolean isApplySuccess;
@Autowired(name = "amount")
String amount;
@Autowired(name = "orderId")
int orderId;
/**
* 发送与接收的广播
**/
@Autowired(name = "isMain")
boolean isMain;
@Autowired(name = "isCar")
boolean isCar;
@BindView(R.id.img_back)
ImageView img_back;
ValueCallback<Uri> uploadFile = null;
ValueCallback<Uri[]> filePathCallback = null;
private ArrayList<String> loadHistoryUrls = new ArrayList<String>();
private Uri imageUri;
@Override
public int getLayoutId() {
return R.layout.activity_loan_webview;
}
@Override
public void initPresenter() {
}
@Override
public void loadData() {
ARouter.getInstance().inject(this);
initView();
}
public void initView() {
if (getIntent() != null) {
if (!NormalRegUtil.isBlank(getIntent().getStringExtra("title"))) {
title = getIntent().getStringExtra("title");
}
}
//二手车
if (isCar) {
} else {
BannerItem bean = SharedInfo.getInstance().getEntity(BannerItem.class);
if (bean != null) {
if (!url.contains(bean.getOrderContractUrl())) {
if (url.startsWith(ConfigUtil.H5Pre)
|| url.startsWith(ConfigUtil.perBaseUrl)
|| url.startsWith(ConfigUtil.perBaseUrlForHttp)) {//表示有可能是协议
if (isApplySuccess) {//是借款申请成功后获取的
url = url + "?token=" + UserInfoTool.getToken() + "&amount=" + amount + "&orderId=" + orderId;
} else {
url = url + "?token=" + UserInfoTool.getToken();
}
}
}
}
}
Log.i("网页拦截中加载的url:", url + "");
//把初始页面Url加入
loadHistoryUrls.add(url);
mWebView.loadUrl(url);
WebUtils.loadWebSetting(mWebView);
mWebView.setWebChromeClient(new MyWebChromeClient());
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//将过滤到的url加入历史栈中
loadHistoryUrls.add(url);
Log.i("网页拦截中加载的url:", url);
view.loadUrl(url);
return super.shouldOverrideUrlLoading(view, url);
}
@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);
}
});
WebUtils.addDownLoadListener(this, mWebView);
WebUtils.loadWebJsMethod(this, mWebView);
}
@Override
protected void onDestroy() {
super.onDestroy();
loadHistoryUrls.clear();
WebUtils.clearWebInfo(mWebView);
}
@Override
public void onBackPressed() {
super.onBackPressed();
WebUtils.receiverGoBack(loadHistoryUrls, mWebView, this, isMain, img_back);
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
Uri uri = null;
if (requestCode == FILECHOOSER_VIDEO_RESULTCODE && resultCode == RESULT_OK && data != null) {
uri = data.getData();
}
if (requestCode == FILECHOOSER_RESULTCODE && resultCode == RESULT_OK) {
uri = WebUtils.getImgeUrl();//拍照片data不会返回uri,用之前暂存下的
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//android 5.0及以上
if (filePathCallback != null) {//将拍摄的照片或者视频回调给H5
if (uri != null) {
filePathCallback.onReceiveValue(new Uri[]{uri});
} else {
filePathCallback.onReceiveValue(null);
}
filePathCallback = null;
}
} else {//android 5.0以下
if (uploadFile != null) {//将拍摄的照片或者视频回调给H5
if (uri != null) {
uploadFile.onReceiveValue(uri);
} else {
uploadFile.onReceiveValue(null);
}
uploadFile = null;
}
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
//判断是否可以返回操作
if (mWebView.canGoBack() && event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
WebUtils.receiverGoBack(loadHistoryUrls, mWebView, this, isMain, img_back);
return true;
}
return super.onKeyDown(keyCode, event);
}
@OnClick({R.id.img_back})
public void onClick(View v) {
switch (v.getId()) {
case R.id.img_back:
WebUtils.receiverGoBack(loadHistoryUrls, mWebView, this, isMain, img_back);
break;
}
}
class MyWebChromeClient extends WebChromeClient {
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress == 100) {
mProgressBar.setVisibility(View.GONE);
} else {
mProgressBar.setVisibility(View.VISIBLE);
mProgressBar.setProgress(newProgress);
}
}
@Override
public void onReceivedTitle(WebView view, String webtitle) {
super.onReceivedTitle(view, webtitle);
LogUtils.logi("网页标题:" + webtitle);
if (!TextUtils.isEmpty(webtitle)) {
mTitle.setTitle(false, null, webtitle);
} else {
mTitle.setTitle(false, null, "提现");
}
}
//Android 5.0 及以上 必须重写此方法
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
boolean fromCamera = fileChooserParams.isCaptureEnabled();
String[] acceptTypes = fileChooserParams.getAcceptTypes();
if (acceptTypes != null && acceptTypes.length > 0) {
boolean isImage = false;
for (String acceptType : acceptTypes) {
if (acceptType.contains("image")) {
isImage = true;
break;
}
}
if (isImage) {//处理图片
if (fromCamera) {//只处理拍照
if (captureImageFromCamera(WebViewActivity.this, imageUri)) {
WebViewActivity.this.filePathCallback = filePathCallback;//暂存,用于拍完照片后回调H5
return true;//返回true表示APP处理文件选择
}
}
}
boolean isVideo = false;
for (String acceptType : acceptTypes) {
if (acceptType.contains("video")) {
isVideo = true;
break;
}
}
if (isVideo) {//处理视频
if (fromCamera) {//只处理拍摄视频
if (captureVideoFromCamera(WebViewActivity.this, imageUri)) {
WebViewActivity.this.filePathCallback = filePathCallback;//暂存,用于拍摄完视频后回调H5
return true;//返回true表示APP处理文件选择
}
}
}
}
return super.onShowFileChooser(webView, filePathCallback, fileChooserParams);
}
//Android 5.0 以下 必须重写此方法
public void openFileChooser(final ValueCallback<Uri> uploadFile, String acceptType, String capture) {
LogUtils.loge("点击文件的类型是:" + acceptType);
boolean fromCamera = !TextUtils.isEmpty(capture);
if (acceptType != null && acceptType.contains("video")) {//处理视频
if (fromCamera) {//只处理拍摄视频
if (captureVideoFromCamera(WebViewActivity.this, imageUri)) {
WebViewActivity.this.uploadFile = uploadFile;//暂存,用于拍摄完视频后回调H5
return;
}
}
}
if (acceptType != null && acceptType.contains("image")) {//处理图片
if (fromCamera) {//只处理拍照
if (captureImageFromCamera(WebViewActivity.this, imageUri)) {
WebViewActivity.this.uploadFile = uploadFile;//暂存,用于拍完照片后回调H5
}
}
}
}
}
}