德尔福XE5的Andr​​oid。如何使用PowerManager.WakeLock? [英] Delphi XE5 Android. How to use PowerManager.WakeLock?

查看:262
本文介绍了德尔福XE5的Andr​​oid。如何使用PowerManager.WakeLock?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想保存在设备上,避免从内存中卸载我的应用程序即使没有用户活动。类似的服务。我做了模块像<一个href="http://stackoverflow.com/questions/18888345/how-to-check-if-network-is-available-on-android-delphi-xe5">How检查网络在Android(德尔福XE5)但是当我运行SetWakeLock系统击碎:

 单元Android.PowerManager;

接口

功能SetWakeLock:布尔;
程序ReleaseWakeLock;

履行

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

类型
  JPowerManager =接口;
  JWakeLock =接口;

  JWakeLockClass =接口(JObjectClass)
  ['{4CF7A13D-15A9-4DEE-8CA7-66600C188CB7}']
  结束;

  [JavaSignature('机器人/ OS /电源管理器/ WakeLock')]
  JWakeLock =接口(JObject)
  ['{55983EDC-782F-490A-BF0C-12207EB7829E}']
    {}方法
    程序获取; CDECL;
    程序释放; CDECL;
    功能isHeld:布尔; CDECL;
  结束;
  TJWakeLock =类(TJavaGenericImport&LT; JWakeLockClass,JWakeLock&GT;)结束;

  JPowerManagerClass =接口(JObjectClass)
  ['{B127DD4E-1DA6-49E7-98BA-5966DC7E26FA}']
  结束;

  [JavaSignature('机器人/ OS /电源管理器')]
  JPowerManager =接口(JObject)
  ['{241C3B3D-3DF0-489B-A33E-3CD7F5D26313}']
    {}方法
    功能newWakeLock(levelAndFlags:整数;标签:的jstring):JWakeLock; CDECL;
  结束;
  TJPowerManager =类(TJavaGenericImport&LT; JPowerManagerClass,JPowerManager&GT;)结束;

功能GetPowerManager:JPowerManager;
变种
  PowerServiceNative:JObject;
开始
  PowerServiceNative:= SharedActivityContext.getSystemService(TJContext.JavaClass.POWER_SERVICE);
  如果未分配(PowerServiceNative),然后
    提高Exception.Create(无法找到电力服务');
  结果:= TJPowerManager.Wrap(
    (PowerServiceNative为ILocalObject).GetObjectID);
  如果未分配(结果),那么
    提高Exception.Create(无法访问电源管理);
结束;

VAR fWakeLock:JWakeLock =零;

功能SetWakeLock:布尔;
变种
  电源管理器:JPowerManager;
开始
  结果:= fWakeLock&LT;&GT;零;
  如果结果然后开始
    电源管理器:= GetPowerManager;
    fWakeLock:= PowerManager.newWakeLock(1,StringToJString('VC')); // PARTIAL_WAKE_LOCK = 1
    结果:= fWakeLock&LT;&GT;零;
    如果结果然后开始
       fWakeLock.acquire;
       结果:= fWakeLock.IsHeld;
    结束;
  结束否则,如果没有fWakeLock.IsHeld话
    fWakeLock.acquire;
结束;

程序ReleaseWakeLock;
开始
  如果fWakeLock&LT;&GT;零,然后开始
    fWakeLock.release;
  结束;
结束;

结束。
 

解决方案

忽略,我引用的注释错了前瞻性的逻辑,你是不是指嵌套类正确的接口声明。

本机适用于我。请注意我用的屏幕唤醒锁(这是德precated,但仍然有效)。

 单元Android.JNI.PowerManager;

接口

功能AcquireWakeLock:布尔;
程序ReleaseWakeLock;

履行

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

类型
  JPowerManager =接口;
  JWakeLock =接口;

  JWakeLockClass =接口(JObjectClass)
  ['{918E171F-CDB8-4464-9507-F49272CE7636}']
  结束;

  [JavaSignature('机器人/ OS /电源管理器$ WakeLock')]
  JWakeLock =接口(JObject)
  ['{D17B1136-FA15-4AEB-85B1-2D490F0FD320}']
    {}方法
    程序获取; CDECL;
    程序释放; CDECL;
    功能isHeld:布尔; CDECL;
  结束;
  TJWakeLock =类(TJavaGenericImport&LT; JWakeLockClass,JWakeLock&GT;)结束;

  JPowerManagerClass =接口(JObjectClass)
  ['{7D0696A2-ADEA-4158-AE1F-5E720DEDBCF9}']
    {属性方法}
    功能_GetFULL_WAKE_LOCK:整数; CDECL;
    功能_GetSCREEN_BRIGHT_WAKE_LOCK:整数; CDECL;
    功能_GetSCREEN_DIM_WAKE_LOCK:整数; CDECL;
    功能_GetPARTIAL_WAKE_LOCK:整数; CDECL;
    {}属性
    //保持屏幕上的明亮和放大器;键盘上
    //德precated在API级别17  - 果冻豆MR1
    物业FULL_WAKE_LOCK:整数读_GetFULL_WAKE_LOCK;
    //保持屏幕上亮
    //德precated在API级别13  - 蜂窝MR2
    物业SCREEN_BRIGHT_WAKE_LOCK:整数读_GetSCREEN_BRIGHT_WAKE_LOCK;
    //保持屏幕暗淡
    //德precated在API级别17  - 果冻豆MR1
    物业SCREEN_DIM_WAKE_LOCK:整数读_GetSCREEN_DIM_WAKE_LOCK;
    //保持CPU的运行,画面+键盘可以熄灭
    物业PARTIAL_WAKE_LOCK:整数读_GetPARTIAL_WAKE_LOCK;
  结束;

  [JavaSignature('机器人/ OS /电源管理器')]
  JPowerManager =接口(JObject)
  ['{DEAED658-4353-4D17-B0A3-8179E48BE87F}']
    {}方法
    功能newWakeLock(levelAndFlags:整数;标签:的jstring):JWakeLock; CDECL;
  结束;
  TJPowerManager =类(TJavaGenericImport&LT; JPowerManagerClass,JPowerManager&GT;)结束;

功能GetPowerManager:JPowerManager;
变种
  PowerServiceNative:JObject;
开始
  PowerServiceNative:= SharedActivityContext.getSystemService(
    TJContext.JavaClass.POWER_SERVICE);
  如果未分配(PowerServiceNative),然后
    提高Exception.Create(无法找到电力服务');
  结果:= TJPowerManager.Wrap(
    (PowerServiceNative为ILocalObject).GetObjectID);
  如果未分配(结果),那么
    提高Exception.Create(无法访问电源管理);
结束;

变种
  WakeLock:JWakeLock =零;

功能AcquireWakeLock:布尔;
变种
  电源管理器:JPowerManager;
开始
  结果:=分配(WakeLock);
  如果没有结果,那么
  开始
    电源管理器:= GetPowerManager;
    WakeLock:= PowerManager.newWakeLock(
      TJPowerManager.JavaClass.SCREEN_BRIGHT_WAKE_LOCK,
      StringToJString(德尔福));
    结果:=分配(WakeLock);
  结束;
  如果结果则
  开始
    如果没有WakeLock.IsHeld话
    开始
      WakeLock.acquire;
      结果:= WakeLock.isHeld
    结束;
  结束;
结束;

程序ReleaseWakeLock;
开始
  如果分配(WakeLock),然后
  开始
    WakeLock.release;
    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 is available on Android ( Delphi XE5 ) but system crushes when I run SetWakeLock:

unit Android.PowerManager;

interface

function SetWakeLock : 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)
  ['{4CF7A13D-15A9-4DEE-8CA7-66600C188CB7}']
  end;

  [JavaSignature('android/os/PowerManager/WakeLock')]
  JWakeLock = interface(JObject)
  ['{55983EDC-782F-490A-BF0C-12207EB7829E}']
    {Methods}
    procedure acquire; cdecl;
    procedure release; cdecl;
    function isHeld: Boolean; cdecl;
  end;
  TJWakeLock = class(TJavaGenericImport<JWakeLockClass, JWakeLock>) end;

  JPowerManagerClass = interface(JObjectClass)
  ['{B127DD4E-1DA6-49E7-98BA-5966DC7E26FA}']
  end;

  [JavaSignature('android/os/PowerManager')]
  JPowerManager = interface(JObject)
  ['{241C3B3D-3DF0-489B-A33E-3CD7F5D26313}']
    {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 fWakeLock : JWakeLock = nil;

function SetWakeLock : boolean;
var
  PowerManager: JPowerManager;
begin
  result := fWakeLock<>nil;
  if result then begin
    PowerManager := GetPowerManager;
    fWakeLock := PowerManager.newWakeLock(1,StringToJString('VC'));  //PARTIAL_WAKE_LOCK =1
    Result := fWakeLock<>nil;
    if Result then begin
       fWakeLock.acquire;
       Result := fWakeLock.IsHeld;
    end;
  end else if not fWakeLock.IsHeld then
    fWakeLock.acquire;
end;

procedure ReleaseWakeLock;
begin
  if fWakeLock<>nil then begin
    fWakeLock.release;
  end;
end;

end.

解决方案

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.

这篇关于德尔福XE5的Andr​​oid。如何使用PowerManager.WakeLock?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆