在网上看到很多关于Settings源代码,都需要添加什么权限,而有些权限有是系统权限,不让设置,下面的方法不需要任何权限就能实现当前GPS状态为开启状态,代码运行后则关闭;反之,则开启

Intent GPSIntent = new Intent();
  GPSIntent.setClassName("com.android.settings",
          "com.android.settings.widget.SettingsAppWidgetProvider");
  GPSIntent.addCategory("android.intent.category.ALTERNATIVE");
  GPSIntent.setData(Uri.parse("custom:3"));
  try {
      PendingIntent.getBroadcast(this, 0, GPSIntent, 0).send();
  } catch (CanceledException e) {
      e.printStackTrace();
  }

 

 

1. 打开WiFi最简单,直接调用系统的方法即可:

/**
  * WIFI网络开关  */
 private void toggleWiFi(Context context, boolean enabled) {
  WifiManager wm = (WifiManager) context
    .getSystemService(Context.WIFI_SERVICE);
  wm.setWifiEnabled(enabled);
 }

 

 

2. 打开移动网络比较麻烦,系统没有直接提供开放的方法,只在ConnectivityManager类中有一个不可见的setMobileDataEnabled方法,查看源代码发现,它是调用IConnectivityManager类中的setMobileDataEnabled(boolean)方法。由于方法不可见,只能采用反射来调用:

/** 
 * 移动网络开关 
 */
private void toggleMobileData(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(); 
 }
}

 

二、

/**  

* 开启系统设置里的移动网络  

*/  

public final void setMobileNetEnable(){

  ConnectivityManager mConnectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

  Object[] arg = null;

  try {

   boolean isMobileDataEnable = invokeMethod("getMobileDataEnabled", arg);

   if(!isMobileDataEnable){

    invokeBooleanArgMethod("setMobileDataEnabled", true);

   }

  } catch (Exception e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

 }

 

@SuppressWarnings({ "rawtypes", "unchecked" })
 public boolean invokeMethod(String methodName,
            Object[]  arg) throws Exception {
    
  ConnectivityManager mConnectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        Class ownerClass = mConnectivityManager.getClass();
        Class[]  argsClass = null;
        if (arg != null) {
            argsClass = new Class[1];
            argsClass[0] = arg.getClass();
        }
        Method method = ownerClass.getMethod(methodName, argsClass);
        Boolean isOpen = (Boolean) method.invoke(mConnectivityManager, arg);
        return isOpen;
    }
 
 @SuppressWarnings({ "rawtypes", "unchecked" })
 public Object invokeBooleanArgMethod(String methodName,
             boolean value) throws Exception {
  
   ConnectivityManager mConnectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
         Class ownerClass = mConnectivityManager.getClass();
         Class[]  argsClass = new Class[1];
             argsClass[0] = boolean.class;
         Method method = ownerClass.getMethod(methodName,argsClass);
         return method.invoke(mConnectivityManager, value);
     }