2009-07-21 12 views
5

Estoy desarrollando una aplicación que supervisa la presencia de la fuente de alimentación de la computadora portátil. Si hay un corte de energía o restauración, me intimidará por correo electrónico. También supervisará y controlará las aplicaciones por correo electrónico (básicamente para controlar mi computadora portátil desde mi oficina por correo electrónico). He terminado con la interfaz de correo electrónico, pero no tengo idea de cómo controlar el suministro de energía/batería desde Java.Monitoreo de la batería o la fuente de alimentación de la computadora portátil de java

Si alguno puede dar algún indicio sobre esto, será de gran ayuda.

Gracias de antemano ....

+1

Ayudaría a conocer la plataforma (SO) ya que es probable que sea específica de la plataforma. – jsight

+0

solo curiosidad ¿por qué usas el verbo íntimo allí? Suena extraño. ¿Quisiste usar otra palabra o es algún tipo de API de correo electrónico? – Victor

+0

Estoy usando Windows Vista y para el "íntimo" fue un error tipográfico que debería haber sido "informar": $. – vcosk

Respuesta

5

Es probable que ya haya resuelto este problema, pero para los demás - se puede hacer de la manera Adam Crume sugiere, el uso de un guión ya escrito battstat.bat de Windows XP y superior. Aquí es un ejemplo de la función resultante:

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

o se puede simplificar la secuencia de comandos para volver encaja directamente verdadero/falso o lo que sea.

+0

Esto es bastante interesante, aunque no está dando el estado actual de la batería correctamente esto es exactamente lo que estaba buscando en ese momento. – vcosk

0

Una forma rápida y sucia de manejar esto es llamar a un programa nativo (a través de Runtime.exec (...)) y analizar la salida. En Windows, el programa nativo podría ser VBScript que usa WMI.

2

En Linux, puede utilizar/proc/acpi/batería/

0

Este es el código que funciona en Windows utilizando la estructura SYSTEM_POWER_STATUS.

Tenga en cuenta que debe agregar jna a sus dependencias (Maven) para que esto funcione.

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

En su código lo llaman así:

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

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

Resultado:

true if charger is plugged in false otherwise 

Esto se ha derivado de BalsusC's answer.

Cuestiones relacionadas