【问题标题】:Monitoring battery or power supply of laptop from java从java监控笔记本电脑的电池或电源
【发布时间】:2009-07-21 16:34:54
【问题描述】:

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

如果有人能提供一些关于这方面的建议,那将是非常有帮助的。

提前致谢....

【问题讨论】:

  • 了解平台 (OS) 会有所帮助,因为这可能是特定于平台的。
  • 只是好奇你为什么在那里使用动词亲密?听起来很奇怪。你的意思是用另一个词还是某种电子邮件 api?
  • 我使用的是 windows vista 并且“亲密”是一个错字应该是“通知”:$。

标签: java hardware-interface


【解决方案1】:

您可能已经解决了这个问题,但对于其他问题 - 您可以按照 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 或任何合适的值。

【讨论】:

  • 这很有趣,虽然它没有正确给出电池的当前状态,但这正是我当时正在寻找的。​​span>
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    快速谷歌搜索出现java acpi library on sourceforge。不过自 2004 年以来就没有更新过。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        这是使用 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's answer

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-12-17
          • 1970-01-01
          • 2011-12-08
          • 1970-01-01
          • 2012-08-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多