以前 EDN(Embarcadero Developer Network)に投稿した記事の転記です。
動画を流すようなアプリなどの場合、画面をスリープ状態にしたくないってことありますよね。
Androidでは PowerManager を使用するとアプリ側からスリープの On/Offを行なうことができます。
注意事項
- スリープを解除すると電池の消耗に影響するため、アプリ側では必ず解除のロジックを考慮する必要があります。
- また、この処理を行なうのには、プロジェクトオプションで WakeLock の箇所にチェックをつけてパーミッションを設定する必要があります。
サンプルコード
フォーム上にボタンを2つおき
- デバイスの設定で設定されているスリープを解除する処理
- 上記を解除する処理
を記述しています。
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.