2009-07-21 29 views
5

Sto sviluppando un'applicazione che monitora la presenza dell'alimentazione del laptop. Se c'è un'interruzione di corrente o un ripristino, mi intenerirà tramite e-mail. Sarà anche il monitoraggio delle applicazioni e il controllo via e-mail (in pratica per controllare il mio portatile dal mio ufficio via e-mail). Ho finito con l'interfacciamento delle e-mail, ma non ho idea di come monitorare l'alimentazione/alimentazione della batteria da java.Monitoraggio della batteria o alimentazione del laptop da java

Se qualcuno può dare qualche puntatore su questo sarà di grande aiuto.

Grazie in anticipo ....

+1

Sarebbe utile conoscere la piattaforma (OS) poiché questa è probabilmente specifica della piattaforma. – jsight

+0

solo curioso perché usi il verbo intimo lì? Sembra strano. volevi usare un'altra parola o è una specie di e-mail? – Victor

+0

Sto usando windows vista e per "intimo" era un refuso che avrebbe dovuto essere "informare": $. – vcosk

risposta

5

Hai probabilmente già risolto questo problema, ma per gli altri - si può fare il modo in cui Adam Crume suggerisce, utilizzando uno script già scritto battstat.bat per Windows XP e versioni successive. Ecco un esempio della funzione risultante:

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

Oppure si può semplificare lo script di restituire si inserisce direttamente vero/falso o qualsiasi altra cosa.

+0

Questo è piuttosto interessante, anche se non fornisce lo stato corrente della batteria correttamente questo è esattamente quello che stavo cercando allora. – vcosk

0

Un modo rapido e sporco per gestire questo è chiamare un programma nativo (tramite Runtime.exec (...)) e analizzare l'output. Su Windows, il programma nativo potrebbe essere VBScript che utilizza WMI.

2

su Linux, è possibile utilizzare/proc/acpi/batteria/

0

Ecco il codice che funziona su Windows utilizzando la struttura SYSTEM_POWER_STATUS.

Nota che è necessario aggiungere jna alle dipendenze (Maven) affinché funzioni.

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

Nel codice chiamare in questo modo:

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

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

Risultato:

true if charger is plugged in false otherwise 

Questa è stata derivata off BalsusC's answer.

Problemi correlati