2010-08-08 71 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

相關問題