2010-08-08 72 views

回答

37

我假设你正在谈论一台笔记本电脑。标准Java SE API中不存在这样的API。此信息仅在操作系统平台本机API中可用。您至少需要JNIJNA(JavaWorld article)才能与平台本机API进行通信。

在Windows中,您需要登录SYSTEM_POWER_STATUS structure。它提供了其中BatteryLifePercent财产,这可能是你的利益。我在旧的forums.sun.com主题中发现了一个有用的基于JNA的代码片段,该主题目前不再可用。所以这个信用实际上就是作者的名字不可知的。

为了得到它的工作,首先在classpath下降jna.jar然后将下面的类未修改复制到项目:

package com.example; 

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

    /** 
    * @see http://msdn2.microsoft.com/en-us/library/aa373232.aspx 
    */ 
    public class SYSTEM_POWER_STATUS extends Structure { 
     public byte ACLineStatus; 
     public byte BatteryFlag; 
     public byte BatteryLifePercent; 
     public byte Reserved1; 
     public int BatteryLifeTime; 
     public int BatteryFullLifeTime; 

     @Override 
     protected List<String> getFieldOrder() { 
      ArrayList<String> fields = new ArrayList<String>(); 
      fields.add("ACLineStatus"); 
      fields.add("BatteryFlag"); 
      fields.add("BatteryLifePercent"); 
      fields.add("Reserved1"); 
      fields.add("BatteryLifeTime"); 
      fields.add("BatteryFullLifeTime"); 
      return fields; 
     } 

     /** 
     * The AC power status 
     */ 
     public String getACLineStatusString() { 
      switch (ACLineStatus) { 
       case (0): return "Offline"; 
       case (1): return "Online"; 
       default: return "Unknown"; 
      } 
     } 

     /** 
     * The battery charge status 
     */ 
     public String getBatteryFlagString() { 
      switch (BatteryFlag) { 
       case (1): return "High, more than 66 percent"; 
       case (2): return "Low, less than 33 percent"; 
       case (4): return "Critical, less than five percent"; 
       case (8): return "Charging"; 
       case ((byte) 128): return "No system battery"; 
       default: return "Unknown"; 
      } 
     } 

     /** 
     * The percentage of full battery charge remaining 
     */ 
     public String getBatteryLifePercent() { 
      return (BatteryLifePercent == (byte) 255) ? "Unknown" : BatteryLifePercent + "%"; 
     } 

     /** 
     * The number of seconds of battery life remaining 
     */ 
     public String getBatteryLifeTime() { 
      return (BatteryLifeTime == -1) ? "Unknown" : BatteryLifeTime + " seconds"; 
     } 

     /** 
     * The number of seconds of battery life when at full charge 
     */ 
     public String getBatteryFullLifeTime() { 
      return (BatteryFullLifeTime == -1) ? "Unknown" : BatteryFullLifeTime + " seconds"; 
     } 

     @Override 
     public String toString() { 
      StringBuilder sb = new StringBuilder(); 
      sb.append("ACLineStatus: " + getACLineStatusString() + "\n"); 
      sb.append("Battery Flag: " + getBatteryFlagString() + "\n"); 
      sb.append("Battery Life: " + getBatteryLifePercent() + "\n"); 
      sb.append("Battery Left: " + getBatteryLifeTime() + "\n"); 
      sb.append("Battery Full: " + getBatteryFullLifeTime() + "\n"); 
      return sb.toString(); 
     } 
    } 

    /** 
    * Fill the structure. 
    */ 
    public int GetSystemPowerStatus(SYSTEM_POWER_STATUS result); 
} 

这里是你如何使用它,例如在main()方法:

 
ACLineStatus: Online 
Battery Flag: High, more than 66 percent 
Battery Life: 100% 
Battery Left: Unknown 
Battery Full: Unknown 

封堵关闭交流10分钟后:

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

System.out.println(batteryStatus); // Shows result of toString() method. 

这版画成功地在我的Latitude E5500以下

 
ACLineStatus: Offline 
Battery Flag: High, more than 66 percent 
Battery Life: 82% 
Battery Left: 2954 seconds 
Battery Full: Unknown 

(不,不坏的电池,我只是编译一部电影,并不断通过WiFi传输;))

+1

'填充结构'是显示这一切的主要方法? – 2013-01-15 15:44:39

+1

@LittleChild:不,这是下面的代码块“以下是您可以使用它的方式”。只需将这些行复制到你的'main()'中。你不需要编辑'Kernel32'接口/类(当然,如果需要的话,可以期待这个包,但这只不过是明显的)。 – BalusC 2013-01-15 15:45:57

+0

示例getBatteryFlagString()方法可能有点误导,因为引用的文档指出BatteryFlag“可以包含一个或多个以下标志。”列出了1,2,4,8,128和255。更可靠的方法可能是如果标志不是255,则为每个值使用“按位与”。虽然,“收费”值(8)可能是您在1,2或4时唯一能看到的值。 – 2014-03-28 21:40:39

相关问题