私はラップトップの電源の存在を監視するアプリケーションを開発しています。停電や復旧があった場合は、メールで親密になります。また、電子メールを介したアプリケーションの監視と制御も行います(基本的に、電子メールを介してオフィスからラップトップを制御します)。電子メールのインターフェースは終了しましたが、Javaから電源/バッテリーの供給を監視する方法がわかりません。
誰かがこれについて何らかの指針を与えることができれば、それは大きな助けになるでしょう。
前もって感謝します ....
私はラップトップの電源の存在を監視するアプリケーションを開発しています。停電や復旧があった場合は、メールで親密になります。また、電子メールを介したアプリケーションの監視と制御も行います(基本的に、電子メールを介してオフィスからラップトップを制御します)。電子メールのインターフェースは終了しましたが、Javaから電源/バッテリーの供給を監視する方法がわかりません。
誰かがこれについて何らかの指針を与えることができれば、それは大きな助けになるでしょう。
前もって感謝します ....
あなたはおそらくこの問題をすでに解決しているでしょうが、他の人にとっては-Windows XP以降用にすでに書かれたスクリプトbattstat.batを使用して、AdamCrumeが提案する方法でそれを行うことができます。結果の関数の例を次に示します。
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;
}
または、スクリプトを簡略化して、True/Falseまたは適切なものを直接返すこともできます。
Linuxでは、/ proc / acpi /battery/を使用できます
グーグルですばやく検索すると、sourceforgeにjavaacpiライブラリが表示されます。ただし、2004年以降は更新されていません。
これを処理するための迅速で汚い方法は、(Runtime.exec(...)を介して)ネイティブプログラムを呼び出し、出力を解析することです。Windowsでは、ネイティブプログラムはWMIを使用するVBScriptである可能性があります。
SYSTEM_POWER_STATUS
構造体を使用してWindowsで機能するコードを次に示します。
jna
これを機能させるには、(Maven)依存関係に追加する必要があることに注意してください。
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);
}
コードでは、次のように呼び出します。
Kernel32.SYSTEM_POWER_STATUS batteryStatus = new Kernel32.SYSTEM_POWER_STATUS();
Kernel32.INSTANCE.GetSystemPowerStatus(batteryStatus);
System.out.println(batteryStatus.isPlugged());
結果:
true if charger is plugged in false otherwise
これはBalsusCの回答から導き出されたものです。