博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android 开关数据流量
阅读量:7279 次
发布时间:2019-06-30

本文共 5793 字,大约阅读时间需要 19 分钟。

hot3.png

在网上找了很长时间,找到了一种通过反射的方法,将ConnectivityManager里面的一个对象IConnectivityManager中的setMobileDataEnabled方法反射出来,因为IConnectivityManager是private的,不能直接调用setMobileDataEnabled

这个方法,具体代码如下:

[java]

  1. /** 

  2.      * gprs狀態 

  3.      * @param getMobileDataEnabled 

  4.      *   

  5.      */  

  6.     public boolean getMobileDataStatus(String getMobileDataEnabled){    

  7.         ConnectivityManager cm;    

  8.         cm = (ConnectivityManager)this.getSystemService(Context.CONNECTIVITY_SERVICE);    

  9.     

  10.         Class cmClass = cm.getClass();    

  11.         Class[] argClasses = null;    

  12.         Object[] argObject = null;    

  13.         Boolean isOpen = false;    

  14.         try{    

  15.            Method method = cmClass.getMethod(getMobileDataEnabled, argClasses);    

  16.            isOpen = (Boolean)method.invoke(cm, argObject);    

  17.         }catch(Exception e){   

  18.             e.printStackTrace();    

  19.         }  

  20.         return isOpen;    

  21.     }  

/**     * gprs狀態     * @param getMobileDataEnabled     * @return     */    public boolean getMobileDataStatus(String getMobileDataEnabled){      	ConnectivityManager cm;        	cm = (ConnectivityManager)this.getSystemService(Context.CONNECTIVITY_SERVICE);          	Class cmClass = cm.getClass();        	Class[] argClasses = null;         	Object[] argObject = null;         	Boolean isOpen = false;         	try{      	   Method method = cmClass.getMethod(getMobileDataEnabled, argClasses);      	   isOpen = (Boolean)method.invoke(cm, argObject);         	}catch(Exception e){        		e.printStackTrace();         	}    	return isOpen;      }

[java]

  1. /** 

  2.     * 移动网络开关 

  3.     */  

  4.    private void setMobileDataEnabled(Context context, boolean enabled) {  

  5.      ConnectivityManager conMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);  

  6.       

  7.      Class<?> conMgrClass = null; // ConnectivityManager类  

  8.      Field iConMgrField = null; // ConnectivityManager类中的字段  

  9.      Object iConMgr = null; // IConnectivityManager类的引用  

  10.      Class<?> iConMgrClass = null; // IConnectivityManager类  

  11.      Method setMobileDataEnabledMethod = null; // setMobileDataEnabled方法  

  12.       

  13.      try {  

  14.       // 取得ConnectivityManager类  

  15.       conMgrClass = Class.forName(conMgr.getClass().getName());  

  16.       // 取得ConnectivityManager类中的对象mService  

  17.       iConMgrField = conMgrClass.getDeclaredField("mService");  

  18.       // 设置mService可访问  

  19.       iConMgrField.setAccessible(true);  

  20.       // 取得mService的实例化类IConnectivityManager  

  21.       iConMgr = iConMgrField.get(conMgr);  

  22.       // 取得IConnectivityManager类  

  23.       iConMgrClass = Class.forName(iConMgr.getClass().getName());  

  24.       // 取得IConnectivityManager类中的setMobileDataEnabled(boolean)方法  

  25.       setMobileDataEnabledMethod = iConMgrClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);  

  26.       // 设置setMobileDataEnabled方法可访问  

  27.       setMobileDataEnabledMethod.setAccessible(true);  

  28.       // 调用setMobileDataEnabled方法  

  29.       setMobileDataEnabledMethod.invoke(iConMgr, enabled);  

  30.      } catch (ClassNotFoundException e) {  

  31.       e.printStackTrace();  

  32.      } catch (NoSuchFieldException e) {  

  33.       e.printStackTrace();  

  34.      } catch (SecurityException e) {  

  35.       e.printStackTrace();  

  36.      } catch (NoSuchMethodException e) {  

  37.       e.printStackTrace();  

  38.      } catch (IllegalArgumentException e) {  

  39.       e.printStackTrace();  

  40.      } catch (IllegalAccessException e) {  

  41.       e.printStackTrace();  

  42.      } catch (InvocationTargetException e) {  

  43.       e.printStackTrace();  

  44.      }  

  45.    }  

 /**     * 移动网络开关     */    private void setMobileDataEnabled(Context context, boolean enabled) {		 ConnectivityManager conMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);				 Class
 conMgrClass = null; // ConnectivityManager类  Field iConMgrField = null; // ConnectivityManager类中的字段  Object iConMgr = null; // IConnectivityManager类的引用  Class
 iConMgrClass = null; // IConnectivityManager类  Method setMobileDataEnabledMethod = null; // setMobileDataEnabled方法  try {   // 取得ConnectivityManager类   conMgrClass = Class.forName(conMgr.getClass().getName());   // 取得ConnectivityManager类中的对象mService   iConMgrField = conMgrClass.getDeclaredField("mService");   // 设置mService可访问   iConMgrField.setAccessible(true);   // 取得mService的实例化类IConnectivityManager   iConMgr = iConMgrField.get(conMgr);   // 取得IConnectivityManager类   iConMgrClass = Class.forName(iConMgr.getClass().getName());   // 取得IConnectivityManager类中的setMobileDataEnabled(boolean)方法   setMobileDataEnabledMethod = iConMgrClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);   // 设置setMobileDataEnabled方法可访问   setMobileDataEnabledMethod.setAccessible(true);   // 调用setMobileDataEnabled方法   setMobileDataEnabledMethod.invoke(iConMgr, enabled);  } catch (ClassNotFoundException e) {   e.printStackTrace();  } catch (NoSuchFieldException e) {   e.printStackTrace();  } catch (SecurityException e) {   e.printStackTrace();  } catch (NoSuchMethodException e) {   e.printStackTrace();  } catch (IllegalArgumentException e) {   e.printStackTrace();  } catch (IllegalAccessException e) {   e.printStackTrace();  } catch (InvocationTargetException e) {   e.printStackTrace();  }    }

出现这个错误找了半天~~~ 没找到解决的方法

[html]

  1. java.lang.NoSuchMethodException: setMobileDataEnabled [boolean]  

java.lang.NoSuchMethodException: setMobileDataEnabled [boolean]

后来终于网上找到一个方法  试下发现可以 

[java]

  1. private void toggleMobileData(Context context, boolean enabled){      

  2.             ConnectivityManager connectivityManager =     

  3.             (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);    

  4.             Method setMobileDataEnabl;  

  5.             try {  

  6.                 setMobileDataEnabl = connectivityManager.getClass().getDeclaredMethod("setMobileDataEnabled", boolean.class);  

  7.                 setMobileDataEnabl.invoke(connectivityManager, enabled);  

  8.             } catch (Exception e) {  

  9.                 e.printStackTrace();  

  10.             }  

  11.      }  

private void toggleMobileData(Context context, boolean enabled){    			ConnectivityManager connectivityManager =   			(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);  			Method setMobileDataEnabl;			try {				setMobileDataEnabl = connectivityManager.getClass().getDeclaredMethod("setMobileDataEnabled", boolean.class);				setMobileDataEnabl.invoke(connectivityManager, enabled);			} catch (Exception e) {				e.printStackTrace();			}	 }

转载于:https://my.oschina.net/u/1014842/blog/338939

你可能感兴趣的文章
图片水印
查看>>
第二阶段冲刺 NO.7
查看>>
类方法, 实例方法, 静态方法
查看>>
蓝桥别 p0101
查看>>
执行npm install 时会报 operation not permitted,unlink......错
查看>>
strcpy/strlen/strcat/strcmp面试总结
查看>>
20190412
查看>>
iOS开发-自动布局和自动旋转
查看>>
Sicily 1342. 开心的金明
查看>>
CTR预估中GBDT与LR融合方案
查看>>
CodeForces 598D Igor In the Museum
查看>>
POJ 3548 Restoring the digits
查看>>
CodeVS 1018 单词接龙(DFS)
查看>>
multer文件上传实例
查看>>
在微软伪静态处理机制下action导致伪静态的地址重现的问题
查看>>
The list of pre-build cross-compiler
查看>>
用Margin还是用Padding
查看>>
创建一个字符设备1.2
查看>>
git基本操作
查看>>
js中typeof的用法汇总[转载]
查看>>