Android(安卓)在webview中设置代理
16lz
2021-01-26
在android1.6之前的api中有有直接的方法来对webview设置代码,但是在之后的API中去掉了。所以只能寻求别的方法来设置代码。
下面代码是用反射原理来对webview设置代理:
Java代码
- publicstaticbooleansetProxy(Contextctx,Stringhost,intport){
- booleanret=false;
- try{
- Log.d("WebViewProxySettings","setProxydefaulthost="+host+"port="+port);
- ObjectrequestQueueObject=getRequestQueue(ctx);
- if(requestQueueObject!=null){
- //CreateProxyconfigobjectandsetitintorequestQ
- HttpHosthttpHost=newHttpHost(host,port,"http");
- setDeclaredField(requestQueueObject,"mProxyHost",httpHost);
- ret=true;
- }
- }catch(Exceptione){
- e.printStackTrace();
- }
- returnret;
- }
- publicstaticStringgetProxyHostname(Contextctx){
- Stringres=null;
- try{
- ObjectrequestQueueObject=getRequestQueue(ctx);
- if(requestQueueObject!=null){
- Objectfild=getDeclaredField(requestQueueObject,"mProxyHost");
- if(fild!=null){
- HttpHosthost=(HttpHost)fild;
- res=host.getHostName();
- }
- }
- }catch(Exceptione){
- e.printStackTrace();
- }
- returnres;
- }
- publicstaticvoidcancelProxy(Contextctx){
- try{
- ObjectrequestQueueObject=getRequestQueue(ctx);
- if(requestQueueObject!=null){
- setDeclaredField(requestQueueObject,"mProxyHost",null);
- }
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- publicstaticObjectgetRequestQueue(Contextctx)throwsException{
- Objectret=null;
- ClassnetworkClass=Class.forName("android.webkit.Network");
- if(networkClass!=null){
- ObjectnetworkObj=invokeMethod(networkClass,"getInstance",newObject[]{ctx},Context.class);
- if(networkObj!=null){
- ret=getDeclaredField(networkObj,"mRequestQueue");
- }
- }
- returnret;
- }
- privatestaticObjectgetDeclaredField(Objectobj,Stringname)
- throwsSecurityException,NoSuchFieldException,
- IllegalArgumentException,IllegalAccessException{
- Fieldf=obj.getClass().getDeclaredField(name);
- f.setAccessible(true);
- Objectout=f.get(obj);
- //System.out.println(obj.getClass().getName()+"."+name+"="+out);
- returnout;
- }
- privatestaticvoidsetDeclaredField(Objectobj,Stringname,Objectvalue)
- throwsSecurityException,NoSuchFieldException,
- IllegalArgumentException,IllegalAccessException{
- Fieldf=obj.getClass().getDeclaredField(name);
- f.setAccessible(true);
- f.set(obj,value);
- }
- privatestaticObjectinvokeMethod(Objectobject,StringmethodName,Object[]params,Class...types)throwsException{
- Objectout=null;
- Classc=objectinstanceofClass?(Class)object:object.getClass();
- if(types!=null){
- Methodmethod=c.getMethod(methodName,types);
- out=method.invoke(object,params);
- }else{
- Methodmethod=c.getMethod(methodName);
- out=method.invoke(object);
- }
- //System.out.println(object.getClass().getName()+"."+methodName+"()="+out);
- returnout;
- }
更多相关文章
- Android自定义action与permission
- Android(安卓)跳转应用权限设置页面 适配小米系统
- 当ListView为空时显示提示语
- Android(安卓)IPC之ContentProvider和Socket(Android开发艺术探索
- ViewFlipper左右拨动模版,包含Listview,ScrollView的拨动
- Android(安卓)Launcher 设置壁纸
- android webview用法小结2 java与javascript的交互
- Android中的工厂模式(减少if-else和switch-case)
- [置顶] 100多个Android(安卓)Demo的整合