Programmatically enable/disable “Battery Saver” mode

馋奶兔 提交于 2019-11-29 12:14:33

问题


I am trying to find if I can enable and/or disable Android's built-in "Battery Saver" mode programmatically.

Any official approaches, or trickery, are welcome.

For reference, here is how to do it following Android's standard UI in 5.0: http://www.androidcentral.com/android-50-lollipop-basics-how-get-more-life-between-charges-battery-saver

I am aware you can detect it -- that is not what I am after.

Thanks all.


回答1:


You can enable/disable Battery Saver programmatically on rooted devices. You have to edit the low_power value in global table, in /data/data/com.android.providers.settings/databases/settings.db file.

If your device supports settings command, you can execute (as root):

settings put global low_power 1

to enable Energy Saver and

settings put global low_power 0

to disable it. If it doesn't, use sqlite3 command:

sqlite3 /data/data/com.android.providers.settings/databases/settings.db "update global set value='1' where name='low_power';"
sqlite3 /data/data/com.android.providers.settings/databases/settings.db "update global set value='0' where name='low_power';"

Remember that you have to unplug your phone from PC first, otherwise system will disable Energy Saver. Use ADB over WiFi or Android Terminal (Emulator).

UPDATE:

The sqlite3 method doesn't seem to be reliable anymore.

I'm not sure if android.os.action.POWER_SAVE_MODE_CHANGED broadcast gets send. Maybe you have to send it manually, like in code from here:

private static String COMMAND_ENABLE = "settings put global low_power 1\n" +
        "am broadcast -a android.os.action.POWER_SAVE_MODE_CHANGED --ez mode true\n";
private static String COMMAND_DISABLE = "settings put global low_power 0\n" +
        "am broadcast -a android.os.action.POWER_SAVE_MODE_CHANGED --ez mode false\n";

Also, it's been reported that a new power_saving entry appeared in settings database, however in Android 6.0.1 I haven't managed to find it. In Android 7.1.1_r13 low_power is still used internally (e.g. here), however it may get changed in some Android release. You may want to keep checking changes in e.g. this and this file.




回答2:


You cannot without rooting your phone. I am not sure why this is the case, especially where location services are required now for viewing scan results since SdkVersion 23+ .

This issue is very revealing. https://code.google.com/p/android/issues/detail?id=185370

The best answer is application developers are being forced to crowd source network location for their google overlords. Notice, the OS itself has no problem displaying scan results without location services on.

Revealing that there is no way to turn on location services without GPS where location services are inactive. This two step shuffle is a major quality of experience issue for users. Turn location services on, then turn GPS off.

Watch this space, more lock downs on the way.



来源:https://stackoverflow.com/questions/28234502/programmatically-enable-disable-battery-saver-mode

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!