谁知道有什么方法可以通过代码编程地启用/禁用wifi优化,或者至少检查它是否启用(以便提示用户)?当启用此功能时,设备进入睡眠状态(尽管唤醒和wifi锁定),与第三方设备的wifi通信将停止。
谢谢!
设备必须是根设备才能使用此方法。你的应用不需要是一个系统应用,因为我们可以授予自己临时的系统应用,如访问。这适用于API 21/4。*,不确定还有什么
添加<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
到AndroidManifest.xml
互联网可能会告诉你,你的应用程序必须是一个系统应用程序,但你可以忽略它,因为这个方法至少在这种情况下解决了这个问题。
使用以下代码(为本文简化)
// Grant your app temporary system level like settings access awesomeness
Runtime.getRuntime().exec("su pm grant <yourpackagename> android.permission.WRITE_SECURE_SETTINGS");
// Read the value first to see if you need to set it at all
int curVal = android.provider.Settings.Global.getInt(getContentResolver(),"wifi_suspend_optimizations_enabled",2);
switch( curVal ) {
case 0:
// already disabled
break;
case 1:
// attempt to disable!
boolean success = android.provider.Settings.Global.putInt(getContentResolver(),"wifi_suspend_optimizations_enabled",0);
if( success ) {
// yay worked! maybe check it again to be sure
}
else {
// failed to put
}
break;
case 2:
// Failed to read value, access not granted
break;
}
我从:http://muzso.hu/2013/04/07/changing-android-system-settings-eg.-airplane-mode-radios-via-commandline-on-rooted-phone
本答案中描述的方法也可用于更改其他受保护的系统设置,但可能难以跟踪要更改的设置的确切名称。有用的信息可以在android-changing-the-system-settings-of-a-root -device-from-inside-the-app中获得,也就是说,你可以在你选择的sqlite编辑器中打开/data/data/com.android.providers.settings/databases/settings.db
来查找你想要更改的设置的表和键名。wifi_suspend_optimizations_enabled
在Global表中,但这不是唯一可用的表。wifi优化之外的其他设置可能需要<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
此信息可能不适用于所有设备或情况。
目前,没有办法以编程方式检查Wifi优化选项。
检查有关wifi api的类。http://developer.android.com/reference/android/net/wifi/package-summary.html
通过ADB shell(假设root访问):
settings set global wifi_suspend_optimizations_enabled 0
您可以通过在关闭和打开屏幕时观察logcat来验证这是否成功:
logcat -v time | grep -e wpa | grep SETSUSPENDMODE
如果您在屏幕关闭期间看到该值被切换&事件,然后Wifi优化被启用,并正在创建你所看到的问题。