Мониторинг батареи или блока питания ноутбука из java

Я разрабатываю приложение, которое отслеживает наличие блока питания ноутбука. Если произойдет отключение или восстановление электроэнергии, я сообщу об этом по электронной почте. Это также будет мониторинг приложений и контроль над электронной почтой (в основном для управления моим ноутбуком из моего офиса по электронной почте). Я закончил с интерфейсом электронной почты, но я понятия не имею, как контролировать источник питания / аккумулятор от java.

Если кто-то может дать какой-то указатель на это, это будет очень полезно.

Заранее спасибо ....


person vcosk    schedule 21.07.2009    source источник
comment
Было бы полезно узнать платформу (ОС), поскольку это, вероятно, зависит от платформы.   -  person jsight    schedule 21.07.2009
comment
просто любопытно, почему ты используешь глагол интимный там? Звучит странно. Вы хотели использовать другое слово или это какой-то API электронной почты?   -  person Victor    schedule 21.07.2009
comment
Я использую Windows Vista, и для интимной опечатки нужно было сообщить: $.   -  person vcosk    schedule 22.07.2009


Ответы (5)


Вы, вероятно, уже решили эту проблему, но для других - вы можете сделать это так, как предлагает Адам Крум, используя уже написанный скрипт battstat .bat для Windows XP и выше. Вот пример полученной функции:

private Boolean runsOnBattery() {
    try {
        Process proc = Runtime.getRuntime().exec("cmd.exe /c battstat.bat");

        BufferedReader stdInput = new BufferedReader(
            new InputStreamReader(proc.getInputStream()));

        String s;
        while ((s = stdInput.readLine()) != null) {
            if (s.contains("mains power")) {
                return false;
            } else if (s.contains("Discharging")) {
                return true;
            }
        }
    } catch (IOException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }

    return false;
}

Или вы можете упростить скрипт, чтобы он возвращал непосредственно True/False или что-то другое.

person rlat    schedule 18.09.2013
comment
Это довольно интересно, хотя текущее состояние батареи не отображается должным образом, это именно то, что я искал тогда. - person vcosk; 20.09.2013

В Linux вы можете использовать /proc/acpi/battery/

person KeyserSoze    schedule 21.07.2009

Быстрый поиск в Google выдает библиотеку Java acpi на sourceforge. Хотя не обновлялся с 2004 года.

person Charlie    schedule 21.07.2009

Быстрый и грязный способ справиться с этим - вызвать собственную программу (через Runtime.exec(...)) и проанализировать вывод. В Windows собственной программой может быть VBScript, использующий WMI.

person Adam Crume    schedule 21.07.2009

Вот код, который работает в Windows с использованием SYSTEM_POWER_STATUS структура.

Обратите внимание, что вам нужно добавить jna к вашим (Maven) зависимостям, чтобы это работало.

import java.util.ArrayList;
import java.util.List;

import com.sun.jna.Native;
import com.sun.jna.Structure;
import com.sun.jna.win32.StdCallLibrary;

public interface Kernel32 extends StdCallLibrary
{
    public Kernel32 INSTANCE = (Kernel32) Native.loadLibrary("Kernel32",
            Kernel32.class);

    public class SYSTEM_POWER_STATUS extends Structure
    {
        public byte ACLineStatus;

        @Override
        protected List<String> getFieldOrder()
        {
            ArrayList<String> fields = new ArrayList<String>();
            fields.add("ACLineStatus");

            return fields;
        }

        public boolean isPlugged()
        {
            return ACLineStatus == 1;
        }
    }

    public int GetSystemPowerStatus(SYSTEM_POWER_STATUS result);
}

В вашем коде назовите это так:

Kernel32.SYSTEM_POWER_STATUS batteryStatus = new Kernel32.SYSTEM_POWER_STATUS();
Kernel32.INSTANCE.GetSystemPowerStatus(batteryStatus);

System.out.println(batteryStatus.isPlugged());

Результат:

true if charger is plugged in false otherwise

Это было получено из ответа BalsusC.

person BullyWiiPlaza    schedule 18.06.2015