Skip to content Skip to sidebar Skip to footer

Delphi Xe5 Android. How To Use Powermanager.wakelock?

I'd like to keep device on and avoid unloading my application from memory even while there is no user activity. Something like service. I made module like How to check if network i

Solution 1:

Ignoring the wrong-looking logic that I cited in a comment, you're not referring to a nested class correctly in the interface declaration.

This unit works for me. Note I'm using a screen wake lock (which is deprecated, but still works).

unit Android.JNI.PowerManager;

interface

function AcquireWakeLock : Boolean;
procedure ReleaseWakeLock;

implementation

uses
  System.SysUtils,
  Androidapi.JNI,
  Androidapi.JNIBridge,
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNI.JavaTypes,
  FMX.Helpers.Android;

type
  JPowerManager = interface;
  JWakeLock = interface;

  JWakeLockClass = interface(JObjectClass)
  ['{918E171F-CDB8-4464-9507-F49272CE7636}']
  end;

  [JavaSignature('android/os/PowerManager$WakeLock')]
  JWakeLock = interface(JObject)
  ['{D17B1136-FA15-4AEB-85B1-2D490F0FD320}']
    {Methods}
    procedure acquire; cdecl;
    procedure release; cdecl;
    function isHeld: Boolean; cdecl;
  end;
  TJWakeLock = class(TJavaGenericImport<JWakeLockClass, JWakeLock>) end;

  JPowerManagerClass = interface(JObjectClass)
  ['{7D0696A2-ADEA-4158-AE1F-5E720DEDBCF9}']
    {Property methods}
    function _GetFULL_WAKE_LOCK: Integer; cdecl;
    function _GetSCREEN_BRIGHT_WAKE_LOCK: Integer; cdecl;
    function _GetSCREEN_DIM_WAKE_LOCK: Integer; cdecl;
    function _GetPARTIAL_WAKE_LOCK: Integer; cdecl;
    {Properties}
    //Keep screen on bright & keyboard on//Deprecated in API level 17 - Jelly Bean MR1
    property FULL_WAKE_LOCK: Integer read _GetFULL_WAKE_LOCK;
    //Keep screen on bright//Deprecated in API level 13 - Honeycomb MR2
    property SCREEN_BRIGHT_WAKE_LOCK: Integer read _GetSCREEN_BRIGHT_WAKE_LOCK;
    //Keep screen on dim//Deprecated in API level 17 - Jelly Bean MR1
    property SCREEN_DIM_WAKE_LOCK: Integer read _GetSCREEN_DIM_WAKE_LOCK;
    //Keep CPU running, screen & keyboard can go off
    property PARTIAL_WAKE_LOCK: Integer read _GetPARTIAL_WAKE_LOCK;
  end;

  [JavaSignature('android/os/PowerManager')]
  JPowerManager = interface(JObject)
  ['{DEAED658-4353-4D17-B0A3-8179E48BE87F}']
    {Methods}
    function newWakeLock(levelAndFlags: Integer; tag: JString): JWakeLock; cdecl;
  end;
  TJPowerManager = class(TJavaGenericImport<JPowerManagerClass, JPowerManager>) end;

function GetPowerManager: JPowerManager;
var
  PowerServiceNative: JObject;
begin
  PowerServiceNative := SharedActivityContext.getSystemService(
    TJContext.JavaClass.POWER_SERVICE);
  if not Assigned(PowerServiceNative) then
    raise Exception.Create('Could not locate Power Service');
  Result := TJPowerManager.Wrap(
    (PowerServiceNative as ILocalObject).GetObjectID);
  if not Assigned(Result) then
    raise Exception.Create('Could not access Power Manager');
end;

var
  WakeLock: JWakeLock = nil;

function AcquireWakeLock: Boolean;
var
  PowerManager: JPowerManager;
begin
  Result := Assigned(WakeLock);
  if not Result then
  begin
    PowerManager := GetPowerManager;
    WakeLock := PowerManager.newWakeLock(
      TJPowerManager.JavaClass.SCREEN_BRIGHT_WAKE_LOCK,
      StringToJString('Delphi'));
    Result := Assigned(WakeLock);
  end;
  if Result then
  begin
    if not WakeLock.IsHeld then
    begin
      WakeLock.acquire;
      Result := WakeLock.isHeld
    end;
  end;
end;

procedure ReleaseWakeLock;
begin
  if Assigned(WakeLock) then
  begin
    WakeLock.release;
    WakeLock := nil
  end;
end;

end.

Solution 2:

Did you add in the android.permission.WAKELOCK permission (shown as Wake lock in Delphi)?

Solution 3:

You Need:

1) setting the Project Options, Uses Permissions, Wake lock = True

2) Adding Android.JNI.PowerManager to the uses clause

3) call:

 AcquireWakeLock; // at start up.

 ReleaseWakeLock; // at shutdown.

from the Android.JNI.PowerManager Unit

Solution 4:

Thanks a lot to blong for solution. For it began to work in Delphi Berlin, I redid the module code. I hope this is useful.

It needs to enable android.permission.WAKELOCK permission in your project.

unit Android.JNI.PowerManager;

interface

function AcquireWakeLock: Boolean;
procedure ReleaseWakeLock;

implementation

uses
  System.SysUtils,
  Androidapi.JNI,
  Androidapi.JNIBridge,
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNI.JavaTypes,
  Androidapi.Helpers,
  Androidapi.JNI.Os, // added in Berlin
  FMX.Helpers.Android;

//type// *** this is in Androidapi.JNI.Os// JPowerManager = interface;// JWakeLock = interface;// *** this is in Androidapi.JNI.Os// JWakeLockClass = interface(JObjectClass)// ['{918E171F-CDB8-4464-9507-F49272CE7636}']// end;// *** this is in Androidapi.JNI.Os// [JavaSignature('android/os/PowerManager$WakeLock')]// JWakeLock = interface(JObject)// ['{D17B1136-FA15-4AEB-85B1-2D490F0FD320}']// { Methods }// procedure acquire; cdecl;// procedure release; cdecl;// function isHeld: Boolean; cdecl;// end;// TJWakeLock = class(TJavaGenericImport<JWakeLockClass, JWakeLock>)// end;// *** this is in Androidapi.JNI.Os// JPowerManagerClass = interface(JObjectClass)// ['{7D0696A2-ADEA-4158-AE1F-5E720DEDBCF9}']// { Property methods }// function _GetFULL_WAKE_LOCK: Integer; cdecl;// function _GetSCREEN_BRIGHT_WAKE_LOCK: Integer; cdecl;// function _GetSCREEN_DIM_WAKE_LOCK: Integer; cdecl;// function _GetPARTIAL_WAKE_LOCK: Integer; cdecl;// { Properties }// // Keep screen on bright & keyboard on// // Deprecated in API level 17 - Jelly Bean MR1// property FULL_WAKE_LOCK: Integer read _GetFULL_WAKE_LOCK;// // Keep screen on bright// // Deprecated in API level 13 - Honeycomb MR2// property SCREEN_BRIGHT_WAKE_LOCK: Integer read _GetSCREEN_BRIGHT_WAKE_LOCK;// // Keep screen on dim// // Deprecated in API level 17 - Jelly Bean MR1// property SCREEN_DIM_WAKE_LOCK: Integer read _GetSCREEN_DIM_WAKE_LOCK;// // Keep CPU running, screen & keyboard can go off// property PARTIAL_WAKE_LOCK: Integer read _GetPARTIAL_WAKE_LOCK;// end;// *** this is in Androidapi.JNI.Os// [JavaSignature('android/os/PowerManager')]// JPowerManager = interface(JObject)// ['{DEAED658-4353-4D17-B0A3-8179E48BE87F}']// { Methods }// function newWakeLock(levelAndFlags: Integer; tag: JString): JWakeLock; cdecl;// end;// TJPowerManager = class(TJavaGenericImport<JPowerManagerClass, JPowerManager>)// end;

function GetPowerManager: JPowerManager;
var
  PowerServiceNative: JObject;
begin
  PowerServiceNative := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.POWER_SERVICE);
  if not Assigned(PowerServiceNative) then
    raise Exception.Create('Could not locate Power Service');
  Result := TJPowerManager.Wrap((PowerServiceNative as ILocalObject).GetObjectID);
  if not Assigned(Result) then
    raise Exception.Create('Could not access Power Manager');
end;

var// *** this is in Androidapi.JNI.Os// WakeLock: JWakeLock = nil;
  WakeLock: JPowerManager_WakeLock = nil;

function AcquireWakeLock: Boolean;
var
  PowerManager: JPowerManager;
begin
  Result := Assigned(WakeLock);
  if not Result then
  begin
    PowerManager := GetPowerManager;
    WakeLock := PowerManager.newWakeLock(TJPowerManager.JavaClass.SCREEN_BRIGHT_WAKE_LOCK,
      StringToJString('Delphi'));
    Result := Assigned(WakeLock);
  end;
  if Result then
  begin
    if not WakeLock.isHeld then
    begin
      WakeLock.acquire;
      Result := WakeLock.isHeld
    end;
  end;
end;

procedure ReleaseWakeLock;
begin
  if Assigned(WakeLock) then
  begin
    WakeLock.release;
    WakeLock := nil
  end;
end;

end.

Solution 5:

When compiling for Android on XE6, add Androidapi.helpers to the uses clause or it can't find the StringToJString routine.

Post a Comment for "Delphi Xe5 Android. How To Use Powermanager.wakelock?"