在android1.6之前的api中有有直接的方法来对webview设置代码,但是在之后的API中去掉了。所以只能寻求别的方法来设置代码。

下面代码是用反射原理来对webview设置代理:

Java代码
  1. publicstaticbooleansetProxy(Contextctx,Stringhost,intport){
  2. booleanret=false;
  3. try{
  4. Log.d("WebViewProxySettings","setProxydefaulthost="+host+"port="+port);
  5. ObjectrequestQueueObject=getRequestQueue(ctx);
  6. if(requestQueueObject!=null){
  7. //CreateProxyconfigobjectandsetitintorequestQ
  8. HttpHosthttpHost=newHttpHost(host,port,"http");
  9. setDeclaredField(requestQueueObject,"mProxyHost",httpHost);
  10. ret=true;
  11. }
  12. }catch(Exceptione){
  13. e.printStackTrace();
  14. }
  15. returnret;
  16. }
  17. publicstaticStringgetProxyHostname(Contextctx){
  18. Stringres=null;
  19. try{
  20. ObjectrequestQueueObject=getRequestQueue(ctx);
  21. if(requestQueueObject!=null){
  22. Objectfild=getDeclaredField(requestQueueObject,"mProxyHost");
  23. if(fild!=null){
  24. HttpHosthost=(HttpHost)fild;
  25. res=host.getHostName();
  26. }
  27. }
  28. }catch(Exceptione){
  29. e.printStackTrace();
  30. }
  31. returnres;
  32. }
  33. publicstaticvoidcancelProxy(Contextctx){
  34. try{
  35. ObjectrequestQueueObject=getRequestQueue(ctx);
  36. if(requestQueueObject!=null){
  37. setDeclaredField(requestQueueObject,"mProxyHost",null);
  38. }
  39. }catch(Exceptione){
  40. e.printStackTrace();
  41. }
  42. }
  43. publicstaticObjectgetRequestQueue(Contextctx)throwsException{
  44. Objectret=null;
  45. ClassnetworkClass=Class.forName("android.webkit.Network");
  46. if(networkClass!=null){
  47. ObjectnetworkObj=invokeMethod(networkClass,"getInstance",newObject[]{ctx},Context.class);
  48. if(networkObj!=null){
  49. ret=getDeclaredField(networkObj,"mRequestQueue");
  50. }
  51. }
  52. returnret;
  53. }
  54. privatestaticObjectgetDeclaredField(Objectobj,Stringname)
  55. throwsSecurityException,NoSuchFieldException,
  56. IllegalArgumentException,IllegalAccessException{
  57. Fieldf=obj.getClass().getDeclaredField(name);
  58. f.setAccessible(true);
  59. Objectout=f.get(obj);
  60. //System.out.println(obj.getClass().getName()+"."+name+"="+out);
  61. returnout;
  62. }
  63. privatestaticvoidsetDeclaredField(Objectobj,Stringname,Objectvalue)
  64. throwsSecurityException,NoSuchFieldException,
  65. IllegalArgumentException,IllegalAccessException{
  66. Fieldf=obj.getClass().getDeclaredField(name);
  67. f.setAccessible(true);
  68. f.set(obj,value);
  69. }
  70. privatestaticObjectinvokeMethod(Objectobject,StringmethodName,Object[]params,Class...types)throwsException{
  71. Objectout=null;
  72. Classc=objectinstanceofClass?(Class)object:object.getClass();
  73. if(types!=null){
  74. Methodmethod=c.getMethod(methodName,types);
  75. out=method.invoke(object,params);
  76. }else{
  77. Methodmethod=c.getMethod(methodName);
  78. out=method.invoke(object);
  79. }
  80. //System.out.println(object.getClass().getName()+"."+methodName+"()="+out);
  81. returnout;
  82. }

更多相关文章

  1. Android自定义action与permission
  2. Android(安卓)跳转应用权限设置页面 适配小米系统
  3. 当ListView为空时显示提示语
  4. Android(安卓)IPC之ContentProvider和Socket(Android开发艺术探索
  5. ViewFlipper左右拨动模版,包含Listview,ScrollView的拨动
  6. Android(安卓)Launcher 设置壁纸
  7. android webview用法小结2 java与javascript的交互
  8. Android中的工厂模式(减少if-else和switch-case)
  9. [置顶] 100多个Android(安卓)Demo的整合

随机推荐

  1. Android(安卓)TextView文字链接4中方法
  2. Android(安卓)官方架构组件(二)——LiveDat
  3. Android的边缘效应的相关类EdgeEffectCom
  4. 【转】android开源项目---tool篇
  5. Android(安卓)SQLite 的介绍和使用(二)
  6. Android中的几种网络请求方式详解
  7. Android中android-async-http开源网络框
  8. Android中Intent的用法总结
  9. Android(安卓)AES加密算法及事实上现
  10. android dom方式创建xml