Android のスリープ制御

By: Chikako Yonezawa

Abstract: Android の PowerManager を使用すると、アプリ側からスリープ状態の On/Off を行なうことができます。

動画などのアプリでは、画面をスリープ状態にしたくないこともあります。
Android の PowerManager を使用すると、アプリ側からスリープ状態の On/Off を行なうことができます。

以下、簡単なコードサンプルです。
フォーム上にボタンを2つ配置し、

  • デバイスの設定で設定されているスリープを解除する処理
  • 上記を解除する処理

を記述しています。

注意事項:

  • スリープを解除すると電池の消耗に影響するため、アプリ側では必ず解除のロジックを考慮する必要があります。
  • また、この処理を行なうのには、プロジェクトオプションで WakeLock の箇所にチェックをつけてパーミッションを設定する必要があります。
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.Controls.Presentation, FMX.StdCtrls
// 以下追加
  , Androidapi.Helpers 
  , Androidapi.Jni.Os
  , Androidapi.Jni.JavaTypes
  , Androidapi.Jni.GraphicsContentViewText
//
  ;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { private 宣言 }
    PW: JPowerManager;
    WL: JPowerManager_WakeLock;
  public
    { public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
// wakelock でスリープの解除を行なっています
// getSystemService で powerService を取得
  PW := TJPowerManager.Wrap(TAndroidHelper.Context.getSystemService(TJContext.JavaClass.POWER_SERVICE));
  if PW <> nil then begin
    // PowerManager の wakeLock を取得
    WL := PW.newWakeLock
      (TJPowerManager.JavaClass.SCREEN_BRIGHT_WAKE_LOCK
        or TJPowerManager.JavaClass.ACQUIRE_CAUSES_WAKEUP,
      StringToJString('Power Manager Test'));
    if WL <> nil then
      WL.acquire; // acquire を実行し wakeLockを実行
  end else
    Button1.Text := 'Not use Power Manager';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
// releaseで wakelockを解除します
  if WL <> nil then  //wakelockが設定されているか
    WL.release;        // 解除
end;

end.



Server Response from: ETNASC03