安卓情景模式開發 控制GPS/WIFI/藍牙/飛行模式 及個人測試
1 private static boolean getGpsState(Context context) { 2 ContentResolver resolver = context.getContentResolver(); 3 boolean open = Settings.Secure.isLocationProviderEnabled(resolver, 4 LocationManager.GPS_PROVIDER); 5 textview.setText("getGpsState:" + open); 6 return open; 7 }
上面是檢測GPS狀態,不需要權限,采用如下方法,然后檢測GPS狀態確實有所改變,但是在模擬器里的GPS開關處還是老樣子,不變。因沒有進行GPS定位測試,無法肯定是否確實開啟GPS。(以下內容摘自http://www.189works.com/article-47762-1.html )
Settings.Secure.setLocationProviderEnabled(getContentResolver(), LocationManager.GPS_PROVIDER, true);
但是當我們調用setLocationProviderEnabled方法后,系統會拋出異常提示需要android.permission.WRITE_SECURE_SETTINGS的權限,即便在mainfest 中添加該權限的請求也是一樣。setLocationProviderEnabled這個方法需要root的權限,要使這個代碼能執行,程序就必須是系統的app,即安裝在/system/app下;或者是請求root權限,這樣除了廠商能將自己的app安裝在/system/app 之下外,只能是需要請求root權限了。
百度了一下,有解決辦法,但是說的不太清除,而且直接copy他們的代碼,運行后gps狀態也沒有改變。而且也沒有說明其原理。
其實除了使用 Settings.Secure.setLocationProviderEnabled 這個方法之外,還有一個方法就是使用系統自帶的電量控制Widget來更改GPS的狀態。
具體代碼如下:
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);
這段代碼是什么意思呢?其實就是通過intent將消息發給com.android.settings.widget.SettingsAppWidgetProvider去處理,因為這個是系統自帶的程序,所以他擁有root權限。
那 Uri.parse("custom:3") 又是什么意思呢,其實custom:3就是電量控制插件上對應的各個按鈕,通過查看改代碼可以知道各個id的情況
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的開關就很容易了,只要簡單調用一下代碼就可以實現了
manager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
manager.setWifiEnabled(false);
manager.setWifiEnabled(true);
控制藍牙的開關
bluetoothadapter.disable();
bluetoothadapter.enable();
控制飛行模式,谷歌沒有提供相關的api,但是我們可以通過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/藍牙/飛行模式 的功能。

浙公網安備 33010602011771號