对于android上GPS的控制,官方提供了相关的API android
Settings.Secure.setLocationProviderEnabled(getContentResolver(), LocationManager.GPS_PROVIDER, true); api
可是当咱们调用setLocationProviderEnabled方法后,系统会抛出异常提示须要android.permission.WRITE_SECURE_SETTINGS的权限,即使在mainfest中添加该权限的请求也是同样。setLocationProviderEnabled这个方法须要root的权限,要使这个代码能执行,程序就必须是系统的app,即安装在/system/app下;或者是请求root权限,这样除了厂商能将本身的app安装在/system/app 之下外,只能是须要请求root权限了。app
百度了一下,有解决办法,可是说的不太清除,并且直接copy他们的代码,运行后gps状态也没有改变。并且也没有说明其原理。ide
其实除了使用 Settings.Secure.setLocationProviderEnabled 这个方法以外,还有一个方法就是使用系统自带的电量控制Widget来更改GPS的状态。spa
具体代码以下: 插件
Intent intent = new Intent();
intent.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider");
intent.addCategory("android.intent.category.ALTERNATIVE");
intent.setData(Uri.parse("custom:3"));
context.sendBroadcast(intent);get
这段代码是什么意思呢?其实就是经过intent将消息发给com.android.settings.widget.SettingsAppWidgetProvider去处理,由于这个是系统自带的程序,因此他拥有root权限。io
那 Uri.parse("custom:3") 又是什么意思呢,其实custom:3就是电量控制插件上对应的各个按钮,经过查看改代码能够知道各个id的状况ast
private static final int BUTTON_BLUETOOTH = 4;
private static final int BUTTON_BRIGHTNESS = 1;
private static final int BUTTON_GPS = 3;
private static final int BUTTON_SYNC = 2;
private static final int BUTTON_WIFI = 0; 原理
这样就能够经过给 com.android.settings.widget.SettingsAppWidgetProvider 发送消息实现更改GPS状态了。同时,更改其余系统设设置的状态也能够经过这个方法实现。
接下来控制WIFI的开关就很容易了,只要简单调用一下代码就能够实现了
WifiManager manager =null;
manager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
manager.setWifiEnabled(false);
manager.setWifiEnabled(true);
控制蓝牙的开关
BluetoothAdapter bluetoothadapter = BluetoothAdapter.getDefaultAdapter();
bluetoothadapter.disable();
bluetoothadapter.enable();
控制飞行模式,谷歌没有提供相关的api,可是咱们能够经过intent广播来实现
Intent intent;
Settings.System.putInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, enabled ? 1 : 0);
intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", enabled);
context.sendBroadcast(intent);
这样,咱们就完成了情景模式中控制GPS/WIFI/蓝牙/飞行模式 的功能。