安卓情景模式開發(一)-控制GPS/WIFI/藍牙/飛行模式



對於android上GPS的控制,官方提供了相關的API 


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

 

 

 這段代碼是什么意思呢?其實就是通過intent將消息發給com.android.settings.widget.SettingsAppWidgetProvider去處理,因為這個是系統自帶的程序,所以他擁有root權限。

 那 Uri.parse("custom:3") 又是什么意思呢,其實custom:3就是電量控制插件上對應的各個按鈕,通過查看改代碼可以知道各個id的情況

 

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

 

 

 


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM