Monitoring battery or power supply of laptop from java

前端 未结 5 1809
失恋的感觉
失恋的感觉 2020-12-18 07:46

I am developing an application which monitors the presence of the power supply of the laptop. If there is a power cut or restoration it will intimate me over email. It will

相关标签:
5条回答
  • 2020-12-18 07:53

    Here's code that works on Windows by using the SYSTEM_POWER_STATUS structure.

    Note that you need to add jna to your (Maven) dependencies for this to work.

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

    In your code call it like this:

    Kernel32.SYSTEM_POWER_STATUS batteryStatus = new Kernel32.SYSTEM_POWER_STATUS();
    Kernel32.INSTANCE.GetSystemPowerStatus(batteryStatus);
    
    System.out.println(batteryStatus.isPlugged());
    

    Result:

    true if charger is plugged in false otherwise
    

    This has been derived off BalsusC's answer.

    0 讨论(0)
  • 2020-12-18 07:55

    You have probably already solved this problem but for the others - you can do it the way Adam Crume suggests, using an already written script battstat.bat for Windows XP and higher. Here is an example of the resulting function:

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

    Or you can simplify the script to return directly True/False or whatever fits.

    0 讨论(0)
  • 2020-12-18 08:02

    On linux, you can use /proc/acpi/battery/

    0 讨论(0)
  • 2020-12-18 08:06

    A quick google search turns up a java acpi library on sourceforge. Hasn't been updated since 2004 though.

    0 讨论(0)
  • 2020-12-18 08:15

    A quick and dirty way to handle this is call a native program (via Runtime.exec(...)) and parse the output. On Windows, the native program might be VBScript that uses WMI.

    0 讨论(0)
提交回复
热议问题