Webview 非http或者https的网络请求拦截

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<>();

extraHeaders.put("Referer", realm);  
view.loadUrl(url, extraHeaders);

} 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&notify_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的一些方法

接下来再介绍一些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

WebSettings是用来管理WebView配置的类。当WebView第一次创建时,内部会包含一个默认配置的集合。若我们想更改这些配置,便可以通过WebSettings里的方法来进行设置。

WebSettings对象可以通过WebView.getSettings()获得,它的生命周期是与它的WebView本身息息相关的,如果WebView被销毁了,那么任何由WebSettings调用的方法也同样不能使用。

获取WebSettings对象

WebSettings webSettings = webView.getSettings();

WebSettings常用方法

(几乎所有的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的缓存模式。当我们加载页面或从上一个页面返回的时候,会按照设置的缓存模式去检查并使用(或不使用)缓存。

缓存模式有四种:

  1. LOAD_DEFAULT:默认的缓存使用模式。在进行页面前进或后退的操作时,如果缓存可用并未过期就优先加载缓存,否则从网络上加载数据。这样可以减少页面的网络请求次数。

  2. LOAD_CACHE_ELSE_NETWORK:只要缓存可用就加载缓存,哪怕它们已经过期失效。如果缓存不可用就从网络上加载数据。

  3. LOAD_NO_CACHE:不加载缓存,只从网络加载数据。

  4. LOAD_CACHE_ONLY:不从网络加载数据,只从缓存加载数据。

通常我们可以根据网络情况将这几种模式结合使用,比如有网的时候使用LOAD_DEFAULT,离线时使用LOAD_CACHE_ONLY、LOAD_CACHE_ELSE_NETWORK,让用户不至于在离线时啥都看不到。

setDatabaseEnabled(boolean flag):启

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
安卓中的WebView可以通过拦截资源请求来实现资源的替换。主要的步骤如下: 首先,我们需要继承自WebViewClient类并重写shouldInterceptRequest方法。该方法在加载资源请求时会被调用,我们可以在此进行资源的拦截和替换。 在shouldInterceptRequest方法中,我们可以通过WebView的loadUrl方法加载我们自定义的资源。例如,我们可以通过读取本地的资源文件,然后使用loadUrl方法加载这些资源。这样,WebView就会加载我们替换的资源而不是原始的网络资源。 另外,需要注意的是,为了确保替换的资源能够正确加载,我们还需要在WebView中启用JavaScript,可以通过调用setJavaScriptEnabled方法来实现。 接下来,我们需要创建一个新的WebView,并设置我们自定义的WebViewClient。然后,通过调用setWebViewClient方法将自定义的WebViewClient设置给WebView。 最后,我们可以通过调用WebView的loadUrl方法加载需要显示的网页,同时WebViewClient中的shouldInterceptRequest方法会被回调,实现资源的拦截和替换。 总结起来,安卓的WebView可以通过拦截资源请求并替换资源来实现对网页的定制化。我们可以通过继承WebViewClient类,并重写shouldInterceptRequest方法,在其中加载我们自定义的资源,从而实现资源的替换。同时,要注意在WebView中启用JavaScript,以确保替换的资源能够正确加载。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值