Delphiでお手軽プログラミング

Delphiでお手軽プログラミングメニュー

Battery Managerを使用してバッテリー残量を取得

~DelphiでAndroidのBattery Managerを使用してバッテリー残量を取得する



1.android.os.BatteryManager.pasファイルの作成

XE10.3以前にはBatteryManager用ネイティブブリッジファイルが無いので作成します。
ブリックファイルの作成はJava2OP.exe("Java To Object Pascal")を使用して作成します。
c:\java2op フォルダ内にandroid.os.BatteryManager.pasファイルを作成します。

コマンドプロンプトを起動(Windows左下スタートボタンを左クリック ⇒ cmd とキーボードから入力 ⇒コマンドプロンプトをクリック)します。


コマンドプロンプトに以下コマンドを入力してブリッジファイルを作成します。
REM JDKのパスを設定(JDK1.8を使用している場合)
SET PATH=%PATH%;C:\Program Files\Java\jdk1.8.0_60\bin;
REM パスを設定(Delphi XE10.2の場合)
SET PATH=%PATH%;C:\Program Files (x86)\Embarcadero\Studio\19.0\bin\converters\java2op;
REM パスを設定(Delphi XE10.3の場合)
SET PATH=%PATH%;C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\converters\java2op;

REM Cドライブ直下にカレントディレクトリを移動
cd /D "c:\"
REM ディレクトリの作成
mkdir java2op
REM 作成したディレクトリに移動
cd /D "c:\java2op"

REM android.os.BatteryManager.pasファイルを作成
java2op.exe -classes android.os.BatteryManager -unit android.os.BatteryManager

2.Delphiを起動

Delphiを起動して新規FMXプロジェクトを作成し、ターゲットフォームをAndroidに設定して、 フォームにTMemoとTButtonを配置します。プロジェクトとユニットを保存します。
1.で作成した android.os.BatteryManager.pas ファイルを保存したプロジェクトフォルダ内に配置します。

3.ソースコードの記述

Button1を押したらMemoにバッテリー状態を表示します。
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts,
  FMX.Controls.Presentation, FMX.StdCtrls, FMX.Memo
  ,Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText
  ,Androidapi.JNI.JavaTypes, FMX.ScrollBox;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { private 宣言 }
  public
    { public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

uses Android.os.BatteryManager;

procedure TForm1.Button1Click(Sender: TObject);
var
  IntentFilter: JIntentFilter;
  BatStat: JIntent;
  status,plugged,level, scale: Integer;
  Sstatus,Splugged:string;
begin
  // 現在の充電状態を特定(バッテリーステータス インテントを取得)
  IntentFilter := TJintentFilter.JavaClass.init(
    TJIntent.JavaClass.ACTION_BATTERY_CHANGED);

  BatStat:=TAndroidHelper.Context.registerReceiver(
    nil, IntentFilter);

  status:=BatStat.getIntExtra(
    TJBatteryManager.JavaClass.EXTRA_STATUS, -1);
  if status=TJBatteryManager.JavaClass.BATTERY_STATUS_CHARGING then
    Sstatus:='充電中';
  if status=TJBatteryManager.JavaClass.BATTERY_STATUS_DISCHARGING then
    Sstatus:='放電中';
  if status=TJBatteryManager.JavaClass.BATTERY_STATUS_FULL then
    Sstatus:='充電完了';
  if status=TJBatteryManager.JavaClass.BATTERY_STATUS_NOT_CHARGING then
    Sstatus:='充電中ではない';
  if status=TJBatteryManager.JavaClass.BATTERY_STATUS_UNKNOWN then
    Sstatus:='充電状態不明';

  plugged:=BatStat.getIntExtra(
    TJBatteryManager.JavaClass.EXTRA_PLUGGED, -1);
  if plugged=TJBatteryManager.JavaClass.BATTERY_PLUGGED_AC then
    Splugged:='ACアダプタ';
  if plugged=TJBatteryManager.JavaClass.BATTERY_PLUGGED_USB then
    Splugged:='USB';
  if plugged=TJBatteryManager.JavaClass.BATTERY_PLUGGED_WIRELESS then
    Splugged:='ワイヤレス';

  level:= BatStat.getIntExtra(
    TJBatteryManager.JavaClass.EXTRA_LEVEL, -1);
  scale:= BatStat.getIntExtra(
    TJBatteryManager.JavaClass.EXTRA_SCALE, -1);

  Memo1.Lines.Add('充電状態:');
  Memo1.Lines.Add(Sstatus);
  Memo1.Lines.Add(Splugged);

  // 充電状態の %を計算
  Memo1.Lines.Add(
    'バッテリー残量:'+IntToStr(100*level div scale) +'%'
  );
end;

end.

4.実行画面




5.参考

java2op.exeで作成した android.os.BatteryManager.pas ファイル

unit android.os.BatteryManager;

interface

uses
  Androidapi.JNIBridge,
  Androidapi.JNI.JavaTypes;

type
// ===== Forward declarations =====

  JBatteryManager = interface;//android.os.BatteryManager

// ===== Interface declarations =====

  JBatteryManagerClass = interface(JObjectClass)
    ['{2FA9FB55-F7F5-4A77-9AB5-53B0B28B0E5C}']
    {class} function _GetACTION_CHARGING: JString; cdecl;
    {class} function _GetACTION_DISCHARGING: JString; cdecl;
    {class} function _GetBATTERY_HEALTH_COLD: Integer; cdecl;
    {class} function _GetBATTERY_HEALTH_DEAD: Integer; cdecl;
    {class} function _GetBATTERY_HEALTH_GOOD: Integer; cdecl;
    {class} function _GetBATTERY_HEALTH_OVERHEAT: Integer; cdecl;
    {class} function _GetBATTERY_HEALTH_OVER_VOLTAGE: Integer; cdecl;
    {class} function _GetBATTERY_HEALTH_UNKNOWN: Integer; cdecl;
    {class} function _GetBATTERY_HEALTH_UNSPECIFIED_FAILURE: Integer; cdecl;
    {class} function _GetBATTERY_PLUGGED_AC: Integer; cdecl;
    {class} function _GetBATTERY_PLUGGED_USB: Integer; cdecl;
    {class} function _GetBATTERY_PLUGGED_WIRELESS: Integer; cdecl;
    {class} function _GetBATTERY_PROPERTY_CAPACITY: Integer; cdecl;
    {class} function _GetBATTERY_PROPERTY_CHARGE_COUNTER: Integer; cdecl;
    {class} function _GetBATTERY_PROPERTY_CURRENT_AVERAGE: Integer; cdecl;
    {class} function _GetBATTERY_PROPERTY_CURRENT_NOW: Integer; cdecl;
    {class} function _GetBATTERY_PROPERTY_ENERGY_COUNTER: Integer; cdecl;
    {class} function _GetBATTERY_STATUS_CHARGING: Integer; cdecl;
    {class} function _GetBATTERY_STATUS_DISCHARGING: Integer; cdecl;
    {class} function _GetBATTERY_STATUS_FULL: Integer; cdecl;
    {class} function _GetBATTERY_STATUS_NOT_CHARGING: Integer; cdecl;
    {class} function _GetBATTERY_STATUS_UNKNOWN: Integer; cdecl;
    {class} function _GetEXTRA_HEALTH: JString; cdecl;
    {class} function _GetEXTRA_ICON_SMALL: JString; cdecl;
    {class} function _GetEXTRA_LEVEL: JString; cdecl;
    {class} function _GetEXTRA_PLUGGED: JString; cdecl;
    {class} function _GetEXTRA_PRESENT: JString; cdecl;
    {class} function _GetEXTRA_SCALE: JString; cdecl;
    {class} function _GetEXTRA_STATUS: JString; cdecl;
    {class} function _GetEXTRA_TECHNOLOGY: JString; cdecl;
    {class} function _GetEXTRA_TEMPERATURE: JString; cdecl;
    {class} function _GetEXTRA_VOLTAGE: JString; cdecl;
    {class} function init: JBatteryManager; cdecl;//Deprecated
    {class} function getLongProperty(id: Integer): Int64; cdecl;//Deprecated
    {class} function isCharging: Boolean; cdecl;//Deprecated
    {class} property ACTION_CHARGING: JString read _GetACTION_CHARGING;
    {class} property ACTION_DISCHARGING: JString read _GetACTION_DISCHARGING;
    {class} property BATTERY_HEALTH_COLD: Integer read _GetBATTERY_HEALTH_COLD;
    {class} property BATTERY_HEALTH_DEAD: Integer read _GetBATTERY_HEALTH_DEAD;
    {class} property BATTERY_HEALTH_GOOD: Integer read _GetBATTERY_HEALTH_GOOD;
    {class} property BATTERY_HEALTH_OVERHEAT: Integer read _GetBATTERY_HEALTH_OVERHEAT;
    {class} property BATTERY_HEALTH_OVER_VOLTAGE: Integer read _GetBATTERY_HEALTH_OVER_VOLTAGE;
    {class} property BATTERY_HEALTH_UNKNOWN: Integer read _GetBATTERY_HEALTH_UNKNOWN;
    {class} property BATTERY_HEALTH_UNSPECIFIED_FAILURE: Integer read _GetBATTERY_HEALTH_UNSPECIFIED_FAILURE;
    {class} property BATTERY_PLUGGED_AC: Integer read _GetBATTERY_PLUGGED_AC;
    {class} property BATTERY_PLUGGED_USB: Integer read _GetBATTERY_PLUGGED_USB;
    {class} property BATTERY_PLUGGED_WIRELESS: Integer read _GetBATTERY_PLUGGED_WIRELESS;
    {class} property BATTERY_PROPERTY_CAPACITY: Integer read _GetBATTERY_PROPERTY_CAPACITY;
    {class} property BATTERY_PROPERTY_CHARGE_COUNTER: Integer read _GetBATTERY_PROPERTY_CHARGE_COUNTER;
    {class} property BATTERY_PROPERTY_CURRENT_AVERAGE: Integer read _GetBATTERY_PROPERTY_CURRENT_AVERAGE;
    {class} property BATTERY_PROPERTY_CURRENT_NOW: Integer read _GetBATTERY_PROPERTY_CURRENT_NOW;
    {class} property BATTERY_PROPERTY_ENERGY_COUNTER: Integer read _GetBATTERY_PROPERTY_ENERGY_COUNTER;
    {class} property BATTERY_STATUS_CHARGING: Integer read _GetBATTERY_STATUS_CHARGING;
    {class} property BATTERY_STATUS_DISCHARGING: Integer read _GetBATTERY_STATUS_DISCHARGING;
    {class} property BATTERY_STATUS_FULL: Integer read _GetBATTERY_STATUS_FULL;
    {class} property BATTERY_STATUS_NOT_CHARGING: Integer read _GetBATTERY_STATUS_NOT_CHARGING;
    {class} property BATTERY_STATUS_UNKNOWN: Integer read _GetBATTERY_STATUS_UNKNOWN;
    {class} property EXTRA_HEALTH: JString read _GetEXTRA_HEALTH;
    {class} property EXTRA_ICON_SMALL: JString read _GetEXTRA_ICON_SMALL;
    {class} property EXTRA_LEVEL: JString read _GetEXTRA_LEVEL;
    {class} property EXTRA_PLUGGED: JString read _GetEXTRA_PLUGGED;
    {class} property EXTRA_PRESENT: JString read _GetEXTRA_PRESENT;
    {class} property EXTRA_SCALE: JString read _GetEXTRA_SCALE;
    {class} property EXTRA_STATUS: JString read _GetEXTRA_STATUS;
    {class} property EXTRA_TECHNOLOGY: JString read _GetEXTRA_TECHNOLOGY;
    {class} property EXTRA_TEMPERATURE: JString read _GetEXTRA_TEMPERATURE;
    {class} property EXTRA_VOLTAGE: JString read _GetEXTRA_VOLTAGE;
  end;

  [JavaSignature('android/os/BatteryManager')]
  JBatteryManager = interface(JObject)
    ['{DA84CB9E-2658-4D4A-A8B4-B7602138E2B7}']
    function getIntProperty(id: Integer): Integer; cdecl;//Deprecated
  end;
  TJBatteryManager = class(TJavaGenericImport<JBatteryManagerClass, JBatteryManager>) end;

implementation

procedure RegisterTypes;
begin
  TRegTypes.RegisterType('android.os.BatteryManager.JBatteryManager', TypeInfo(android.os.BatteryManager.JBatteryManager));
end;

initialization
  RegisterTypes;
end.




Copyright 2019 Mam