Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Programmatically enable/disable "Battery Saver" mode

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.

like image 921
Christopher Bull Avatar asked Jan 30 '15 11:01

Christopher Bull


People also ask

How do I permanently turn off battery saver?

Battery Saver settings:Go to your phone settings. Tap Battery. Make sure that Battery Saver & Super Battery Saver are toggled OFF.

What is ignore battery optimization?

Tap 'Ignore optimizations' or 'Power saving exclusions'. Tap the desired app to disable battery optimization for that specific app. Ignoring battery optimizations may result in a faster battery drain.

Why does battery saver mode come on?

Battery saver mode changes certain settings to conserve battery power until you can recharge your phone. If you turn Battery saver mode On, it will automatically activate when the battery charge level drops to the level you set.


2 Answers

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.

like image 108
pzmarzly Avatar answered Sep 18 '22 15:09

pzmarzly


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.

like image 34
pjc Avatar answered Sep 20 '22 15:09

pjc