2009-07-21 9 views
5

Pracuję nad aplikacją, która monitoruje obecność zasilacza laptopa. Jeśli nastąpi przerwa w zasilaniu lub przywrócenie zasilania, skontaktuje się on z nami drogą e-mailową. Będzie również monitorować i kontrolować aplikacje za pomocą poczty elektronicznej (w zasadzie, aby kontrolować mój laptop z mojego biura przez e-mail). Skończyłem z interfejsem e-mail, ale nie mam pojęcia, jak monitorować zasilanie/zasilanie bateryjne z java.Monitorowanie baterii lub zasilacza laptopa z java

Jeśli ktoś może dać wskazówkę na ten temat, będzie bardzo pomocne.

góry dzięki ....

+1

Pomoże to poznać platformę (OS), ponieważ jest to prawdopodobne dla danej platformy. – jsight

+0

tylko ciekawy dlaczego używasz czasownika intymnego? Brzmi dziwnie. czy chciałeś użyć innego słowa, czy jest to jakiś api? – Victor

+0

Używam Windows Vista, a dla "intymności" literówka powinna być "informować": $. – vcosk

Odpowiedz

5

Prawdopodobnie już rozwiązać ten problem, ale dla innych - można zrobić to tak, Adam Crume sugeruje, używając już napisany scenariusz battstat.bat dla Windows XP i nowsze. Oto przykład otrzymanej funkcji:

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

Albo można uprościć skrypt, aby powrócić bezpośrednio Prawda/Fałsz lub cokolwiek pasuje.

+0

To jest całkiem interesujące, chociaż nie podaje aktualnego stanu baterii, to dokładnie to, czego szukałem wtedy. – vcosk

0

Szybkim i brudnym sposobem radzenia sobie z tym jest wywołanie programu macierzystego (przez Runtime.exec (...)) i przeanalizowanie danych wyjściowych. W systemie Windows rodzimym programem może być VBScript, który korzysta z WMI.

0

Oto kod, który działa w systemie Windows przy użyciu struktury SYSTEM_POWER_STATUS.

Pamiętaj, że musisz dodać jna do swoich (Maven) zależności, aby to działało.

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

W kodzie nazwać tak:

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

System.out.println(batteryStatus.isPlugged()); 

Wynik:

true if charger is plugged in false otherwise 

Zostało pochodzi od BalsusC's answer.

Powiązane problemy