對於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/藍牙/飛行模式 的功能。