我正在开发一个监控笔记本电脑电源是否存在的应用程序。如果停电或恢复,它会通过电子邮件通知我。它还将应用程序监视和控制电子邮件(基本上是通过电子邮件从我的办公室控制我的笔记本电脑)。我完成了电子邮件接口,但我不知道如何从 java 监控电源/电池供应。
如果有人可以对此提供一些指导,那将有很大帮助。
提前致谢 ....
我正在开发一个监控笔记本电脑电源是否存在的应用程序。如果停电或恢复,它会通过电子邮件通知我。它还将应用程序监视和控制电子邮件(基本上是通过电子邮件从我的办公室控制我的笔记本电脑)。我完成了电子邮件接口,但我不知道如何从 java 监控电源/电池供应。
如果有人可以对此提供一些指导,那将有很大帮助。
提前致谢 ....
您可能已经解决了这个问题,但对于其他问题 - 您可以按照 Adam Crume 建议的方式进行,使用 Windows XP 及更高版本的已编写脚本battstat.bat。以下是结果函数的示例:
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<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 的回答中得出的。