首页 > 代码库 > android 开关数据流量

android 开关数据流量

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

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


[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. /** 

  2.      * gprs狀態 

  3.      * @param getMobileDataEnabled 

  4.      * @return  

  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] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  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] view plaincopyprint?在CODE上查看代码片派生到我的代码片

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

java.lang.NoSuchMethodException: setMobileDataEnabled [boolean]


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

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片

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

android 开关数据流量