从java监控笔记本电脑的电池或电源

我正在开发一个监视笔记本电脑电源的应用程序。 如果停电或恢复,它将通过电子邮件与我保持联系。 它还将通过电子邮件进行应用程序监控和控制(基本上是通过电子邮件从我办公室控制我的笔记本电脑) 我完成了电子邮件接口,但我不知道如何监控java的电源/电池供应。

如果任何可以给出一些指针,这将是非常有帮助的。

提前致谢 ….

你可能已经解决了这个问题,但对于其他人 – 你可以像Adam Crume建议的那样,使用已经编写的脚本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或任何适合。

在linux上,你可以使用/ proc / acpi / battery /

快速谷歌搜索在sourceforge上显示了一个java acpi库 。 自2004年以来没有更新过。

处理此问题的快速而肮脏的方法是调用本机程序(通过Runtime.exec(…))并解析输出。 在Windows上,本机程序可能是使用WMI的VBScript。

这是使用SYSTEM_POWER_STATUS结构在Windows上运行的代码。

请注意,您需要将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 getFieldOrder() { ArrayList fields = new ArrayList(); 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的答案中得出的 。