赞
踩
webview调起拨打电话,支付宝,微信,qq等 url拦截
关键步骤
1,extends WebViewClient
2,复写其方法shouldOverrideUrlLoading (webview.loadURL的时候才会调用)
具体代码实现:
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
KLog.e("urlurl====="+url);
if( url.startsWith("http:") || url.startsWith("https:") ) {
if(url.startsWith("https://wx.tenpay.com")){//H5使用微信支付
Map<String, String> extraHeaders = new HashMap<>();
} else{
view.loadUrl(url);
}
}else{ //非http或者https的网络请求拦截,用action_view启动。可能报错。
try {
Uri uri = Uri.parse(url);
Intent intent =new Intent(Intent.ACTION_VIEW, uri);
view.getContext().startActivity(intent);
}catch (Exception e){
e.printStackTrace();
if (url.startsWith("alipay")){
Toast.makeText(view.getContext(), "请确认是否安装支付宝",Toast.LENGTH_SHORT).show();
}else if (url.startsWith("mqqwpa")){
Toast.makeText(view.getContext(), "请确认是否安装QQ",Toast.LENGTH_SHORT).show();
}
}
}
return true;
}
注意:如不处理的话,会提示找不到网页
下面是调用支付宝付款,出现的错误
找不到网页 alipays://platformapi/startapp?appid=20000125&ordersuffix=h5_route_token
----------------------唤起支付宝前会发起请求,webview的连续动作是先后请求两个url-------------------------------
1.http://tt.cpostcard.com/Wap/Shop/pay/sid/0/orderid/492/paytype/alipayApp
2.https://mclient.alipay.com/home/exterfaceAssign.htm?alipay_exterface_invoke_assign_client_ip=222.128.6.225&body=20161229125138-492&subject=20161229125138-492&sign_type=RSA¬ify_url=http%3A%2F%2Ftest.pay.hualumedia.com%2Fcallback%2Falipay%2Fproject%2Fwxmall&out_trade_no=20161229125138-492&return_url=http%3A%2F%2Ftest.pay.hualumedia.com%2Fcallback%2Falipay%2Fpage%2F1%2Fproject%2Fwxmall&sign=CBLgNa9chILk45N6h0KrqOaXR90sAxMKGKUtfWNr7Ie1NF8w5pUy8ZtyJdsUovzGXbXVy6Zssq%2FkHoWad79rcYutsL0qsvdum0WJO0%2BYGjqNDuf%2BMqey8ax8B7Y97WmWVtomsQgG18rMkcJAfUT8heXIy3N1lwGDMLbgatJiWRk%3D&app_pay=Y&_input_charset=utf-8&it_b_pay=30m&alipay_exterface_invoke_assign_target=mapi_direct_trade.htm&alipay_exterface_invoke_assign_model=cashier&total_fee=129.00&service=alipay.wap.create.direct.pay.by.user&partner=2088111492620239&seller_id=hualumedia%40sina.com&alipay_exterface_invoke_assign_sign=_j9_c_n3_x_b2uo_p_fz_f_qgbzrj7c_s%2F%2B4_qc_iy_z_h_jc_tl_gu_y_do_ps_ls_f3w_j22_d7w%3D%3D&payment_type=1
之后返回一个意图,也是用这个意图来打开支付宝app
alipays://platformapi/startApp?appId=20000125&orderSuffix=h5_route_token%3D%2294b58b83d6708541f9563c74fd14eba0%22%26is_h5_route%3D%22true%22#Intent;scheme=alipays;package=com.eg.android.AlipayGphone;end
接下来再介绍一些WebView的常用方法,具体演示会在后面章节的代码里统一展示。
String getUrl():获取当前页面的URL。
reload():重新reload当前的URL,即刷新。
boolean canGoBack():用来确认WebView里是否还有可回退的历史记录。通常我们会在WebView里重写返回键的点击事件,通过该方法判断WebView里是否还有历史记录,若有则返回上一页。
boolean canGoForward():用来确认WebView是否还有可向前的历史记录。
boolean canGoBackOrForward(int steps):以当前的页面为起始点,用来确认WebView的历史记录是否足以后退或前进给定的步数,正数为前进,负数为后退。
goBack():在WebView历史记录后退到上一项。
goForward():在WebView历史记录里前进到下一项。
goBackOrForward(int steps):以当前页面为起始点,前进或后退历史记录中指定的步数,正数为前进,负数为后退。
clearCache(boolean includeDiskFiles):清空网页访问留下的缓存数据。需要注意的时,由于缓存是全局的,所以只要是WebView用到的缓存都会被清空,即便其他地方也会使用到。该方法接受一个参数,从命名即可看出作用。若设为false,则只清空内存里的资源缓存,而不清空磁盘里的。
clearHistory():清除当前webview访问的历史记录。
clearFormData():清除自动完成填充的表单数据。需要注意的是,该方法仅仅清除当前表单域自动完成填充的表单数据,并不会清除WebView存储到本地的数据。
onPause():当页面被失去焦点被切换到后台不可见状态,需要执行onPause操作,该操作会通知内核安全地暂停所有动作,比如动画的执行或定位的获取等。需要注意的是该方法并不会暂停JavaScript的执行,若要暂停JavaScript的执行请使用接下来的这个方法。
onResume():在先前调用onPause()后,我们可以调用该方法来恢复WebView的运行。
pauseTimers():该方法面向全局整个应用程序的webview,它会暂停所有webview的layout,parsing,JavaScript Timer。当程序进入后台时,该方法的调用可以降低CPU功耗。
resumeTimers():恢复pauseTimers时的所有操作。
destroy():销毁WebView。需要注意的是:这个方法的调用应在WebView从父容器中被remove掉之后。我们可以手动地调用
用例如下:
- rootLayout.removeView(webView);
- webView.destroy();
getScrollY():该方法返回的当前可见区域的顶端距整个页面顶端的距离,也就是当前内容滚动的距离。
getHeight():方法都返回当前WebView这个容器的高度。其实以上两个方法都属于View。
getContentHeight():该方法返回整个HTML页面的高度,但该高度值并不等同于当前整个页面的高度,因为WebView有缩放功能, 所以当前整个页面的高度实际上应该是原始HTML的高度再乘上缩放比例。因此,准确的判断方法应该是:
- if (webView.getContentHeight() * webView.getScale() == (webView.getHeight() + webView.getScrollY())) {
- //已经处于底端
- }
-
- if(webView.getScrollY() == 0){
- //处于顶端
- }
pageUp(boolean top):将WebView展示的页面滑动至顶部。
pageDown(boolean bottom):将WebView展示的页面滑动至底部。
WebSettings是用来管理WebView配置的类。当WebView第一次创建时,内部会包含一个默认配置的集合。若我们想更改这些配置,便可以通过WebSettings里的方法来进行设置。
WebSettings对象可以通过WebView.getSettings()获得,它的生命周期是与它的WebView本身息息相关的,如果WebView被销毁了,那么任何由WebSettings调用的方法也同样不能使用。
WebSettings webSettings = webView.getSettings();
(几乎所有的set方法都有相应的get方法,这里就只介绍set了。另,所有未写方法返回值类型的皆为空类型) setJavaScriptEnabled(boolean flag):设置WebView是否可以运行JavaScript。
setJavaScriptCanOpenWindowsAutomatically(boolean flag):设置WebView是否可以由JavaScript自动打开窗口,默认为false,通常与JavaScript的window.open()配合使用。
setAllowFileAccess(boolean allow):启用或禁用WebView访问文件数据。
setBlockNetworkImage(boolean flag):禁止或允许WebView从网络上加载图片。需要注意的是,如果设置是从禁止到允许的转变的话,图片数据并不会在设置改变后立刻去获取,而是在WebView调用reload()的时候才会生效。 这个时候,需要确保这个app拥有访问Internet的权限,否则会抛出安全异常。 通常没有禁止图片加载的需求的时候,完全不用管这个方法,因为当我们的app拥有访问Internet的权限时,这个flag的默认值就是false。
setSupportZoom(boolean support):设置是否支持缩放。
setBuiltInZoomControls(boolean enabled):显示或不显示缩放按钮(wap网页不支持)。
setSupportMultipleWindows(boolean support):设置WebView是否支持多窗口。
setLayoutAlgorithm(WebSettings.LayoutAlgorithm l):指定WebView的页面布局显示形式,调用该方法会引起页面重绘。默认值为LayoutAlgorithm#NARROW_COLUMNS。
setNeedInitialFocus(boolean flag):通知WebView是否需要设置一个节点获取焦点当WebView#requestFocus(int,android.graphics.Rect)被调用时,默认为true。
setAppCacheEnabled(boolean flag):启用或禁用应用缓存。
setAppCachePath(String appCachePath):设置应用缓存路径,这个路径必须是可以让app写入文件的。该方法应该只被调用一次,重复调用会被无视~
setCacheMode(int mode):用来设置WebView的缓存模式。当我们加载页面或从上一个页面返回的时候,会按照设置的缓存模式去检查并使用(或不使用)缓存。
缓存模式有四种:
LOAD_DEFAULT:默认的缓存使用模式。在进行页面前进或后退的操作时,如果缓存可用并未过期就优先加载缓存,否则从网络上加载数据。这样可以减少页面的网络请求次数。
LOAD_CACHE_ELSE_NETWORK:只要缓存可用就加载缓存,哪怕它们已经过期失效。如果缓存不可用就从网络上加载数据。
LOAD_NO_CACHE:不加载缓存,只从网络加载数据。
LOAD_CACHE_ONLY:不从网络加载数据,只从缓存加载数据。
通常我们可以根据网络情况将这几种模式结合使用,比如有网的时候使用LOAD_DEFAULT,离线时使用LOAD_CACHE_ONLY、LOAD_CACHE_ELSE_NETWORK,让用户不至于在离线时啥都看不到。
setDatabaseEnabled(boolean flag):启
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。