希望在Android上的Delphi应用程序中保持屏幕显示

时间:2016-01-15 00:52:31

标签: android delphi

我想在Android的Delphi应用程序中保持屏幕显示。

我知道有两种方法:

  1. 使用窗口管理器和FLAG_KEEP_SCREEN_ON

  2. 使用"唤醒锁定"。

  3. 我遇到的问题是,我似乎无法获得WindowManager个实例,更不用说从布局类中获取标志了,并且似乎没有定义唤醒锁(在至少在XE8中。

    窗口标志似乎是最好的方式,但似乎没有办法成功。

    有谁知道怎么做?

3 个答案:

答案 0 :(得分:4)

使用addFlags()FormCreate()中调用FLAG_KEEP_SCREEN_ON的解决方案在Delphi 10.1 Berlin中与Android 6(以及可能的其他组合)结合使用时无效。

您将收到以下异常:

  

带有消息的异常类EJNIException   'android.view.ViewRootImpl $ CalledFromWrongThreadException:只有   创建视图层次结构的原始线程可以触及其视图。'。

不知何故,Android / Delphi的线程已经改变,因为这曾经起作用(根据许多消息)。我让它工作的唯一方法(使用那一行)是将这一行放在Application.Initialize;下的主项目代码中。

uses
  Androidapi.Helpers,
  Androidapi.JNI.GraphicsContentViewText;

begin
  Application.Initialize;
  SharedActivity.getWindow.addFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_KEEP_SCREEN_ON);
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
end.

但是当您想在程序中打开和关闭此标志时,您需要能够在表单代码中执行它。在这种情况下,您可以使用CallInUIThreadAndWaitFinishing()让此命令在UIThread中运行。然后你没有得到提到的异常并且标志有效。

uses
  FMX.Helpers.Android,
  Androidapi.Helpers,
  Androidapi.JNI.GraphicsContentViewText;

procedure TMainForm.btnKeepScreenOnAddClick(Sender: TObject);
begin
  CallInUIThreadAndWaitFinishing(
    procedure
    begin
      SharedActivity.getWindow.addFlags(
        TJWindowManager_LayoutParams.JavaClass.FLAG_KEEP_SCREEN_ON);
    end);
end;

procedure TMainForm.btnKeepScreenOnClearClick(Sender: TObject);
begin
  CallInUIThreadAndWaitFinishing(
    procedure
    begin
      SharedActivity.getWindow.clearFlags(
        TJWindowManager_LayoutParams.JavaClass.FLAG_KEEP_SCREEN_ON);
    end);
end;

答案 1 :(得分:1)

根据lowrider的评论,这个答案很有效:

Delphi XE5 Android. How to use PowerManager.WakeLock?

我确实要求不使用FMX框架(不提及),但我能够通过将FMX.Helpers.Android引用替换为Androidapi.helpers来在XE8中实现此目的(只需要一个,而不是两个都需要)

答案 2 :(得分:1)

要在Delphi中使用FLAG_KEEP_SCREEN_ON标志,请尝试以下方法:

uses
  Androidapi.JNI.App,
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.Helpers;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  SharedActivity.getWindow.addFlags(TJWindowManager_LayoutParams.JavaClass.FLAG_KEEP_SCREEN_ON);
end;