2010-08-08 28 views

Trả lời

37

Tôi cho rằng bạn đang nói về máy tính xách tay. Không có API nào tồn tại trong API chuẩn Java SE. Thông tin này chỉ có sẵn trong API nền tảng hệ điều hành. Bạn sẽ cần ít nhất JNI hoặc JNA(JavaWorld article) để có thể giao tiếp với API gốc nền tảng.

Trong Windows, bạn muốn móc trên SYSTEM_POWER_STATUS structure. Nó cung cấp trong số những người khác các tài sản BatteryLifePercent mà có thể được quan tâm của bạn. Tôi tìm thấy một đoạn mã dựa trên JNA hữu ích trong một chủ đề forums.sun.com cũ hiện không còn nữa. Vì vậy, tín dụng thực sự đi đến Tác giả Tên của ai không được biết đến.

Để có được nó để làm việc, đầu tiên thả jna.jar trong classpath và sau đó sao chép các lớp sau chưa sửa đổi vào dự án của bạn:

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

Đây là cách bạn có thể sử dụng nó, ví dụ trong main() phương pháp của bạn:

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

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

in này thành công sau tại Latitude E5500 của tôi:

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

Và sau khi cắm ra khỏi AC trong 10 phút:

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

(không, không pin xấu, tôi chỉ đang biên soạn phim và liên tục chuyển qua wifi ngay bây giờ;))

+1

'Điền vào cấu trúc' là phương pháp chính để hiển thị tất cả điều này? –

+1

@LittleChild: không, đó là khối mã bên dưới "Đây là cách bạn có thể sử dụng nó". Chỉ cần copypaste những dòng đó vào 'main()' của bạn. Bạn không cần phải chỉnh sửa giao diện/lớp 'Kernel32' (mong đợi của gói nếu cần thiết, nhưng không có gì rõ ràng hơn). – BalusC

+0

Ví dụ phương thức getBatteryFlagString() có thể gây nhầm lẫn một chút vì tài liệu tham chiếu nói rằng BatteryFlag "có thể chứa một hoặc nhiều cờ sau đây". Với 1, 2, 4, 8, 128 và 255 được liệt kê. Cách tiếp cận đáng tin cậy hơn có thể là sử dụng "bitwise AND" cho mỗi giá trị nếu cờ không phải là 255. Mặc dù vậy, giá trị "sạc" (8) có lẽ là thứ duy nhất bạn có thể xem với 1, 2 hoặc 4. –

Các vấn đề liên quan