想在Android上的Delphi应用程序中保持屏幕打开吗

想在Android上的Delphi应用程序中保持屏幕打开吗,android,delphi,Android,Delphi,我想在我的Android Delphi应用程序中保持屏幕打开 我知道有两种方法: 使用窗口管理器和标志保持屏幕打开 带有“唤醒锁” 我遇到的问题是,我似乎无法获得WindowManager实例,更不用说从layouts类中获取标志,并且似乎没有定义唤醒锁(至少在XE8中) 窗口标志似乎是最好的选择,但似乎没有成功之路 有人知道怎么做吗?根据lowrider的评论,这个答案很有效: 我确实要求不使用FMX框架(没有提及),但我在XE8中通过将FMX.Helpers.Android引用替换为And

我想在我的Android Delphi应用程序中保持屏幕打开

我知道有两种方法:

  • 使用窗口管理器和标志保持屏幕打开

  • 带有“唤醒锁”

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

    窗口标志似乎是最好的选择,但似乎没有成功之路


    有人知道怎么做吗?

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


    我确实要求不使用FMX框架(没有提及),但我在XE8中通过将
    FMX.Helpers.Android
    引用替换为
    Androidapi.Helpers
    (只需要一个,而不是两个都需要)。

    要在Delphi中使用
    标志保持屏幕打开
    标志,请尝试以下操作:

    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;
    

    FormCreate()
    中使用
    FLAG\u KEEP\u SCREEN\u打开
    调用
    addFlags()
    的解决方案在Delphi10.1 Berlin中与Android 6(可能还有其他组合)结合使用时不起作用

    您将获得以下异常:

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

    不知何故,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;
    

    我在过去一直遵循这一点,它奏效了:。确保在荷兰论坛的项目信息中添加必要的信息(见上面链接中的一些评论),我们发现,如果你在FormCreate中这样做,它将不起作用。将它放在应用程序之后的主项目源中。初始化它确实有效。请参阅@Rik,讨论中没有提到它在OnCreate中不起作用。由于它是一个特定于窗口的设置,可以随时设置和清除,我不明白为什么它不能在OnCreate中工作。您是否有任何关于为什么它在OnCreate中不起作用的具体细节?它在主UI线程中被调用,与DPR代码相同。关于它在OnCreate中不起作用的讨论是在我所指的文章之前的几篇文章。此处:。B.T.W.在那次讨论中我是rvk,我在OnCreate中发布了这样做的建议后尝试了一下,它给了我安卓系统的黑屏,应用程序被挂了。将其置于应用程序下。初始化它有效。也许它也可以放在一个按钮中(clearflags放在另一个按钮中),但我还没有试过。我明天会试试,然后报告到底什么有效,什么无效。好的,测试一下。在Delphi 10.1 Berlin中,我总是遇到这样一个异常,即
    Project Project1.apk引发的异常类EJNIException,消息为“android.view.ViewRootImpl$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能触及其视图。”。
    这可能是Berlin 10.1中的一个错误(因为表单线程和主线程是相同的)或者Android 6.0.1有点奇怪。如果我没有捕捉到异常,应用程序就会崩溃。如果我用try/except捕捉到异常,所有都正常工作,屏幕保持打开(这让我相信这是Delphi的问题)。它在10.2.1上似乎运行良好,但在表单创建后我如何管理它?因此,每次用户选中复选框或屏幕上未关闭的内容时!!SharedActivity已被降低,您现在可以使用“TAndroidHelper.Activity”…并添加
    uses System.SysUtils,Androidapi.JNI.App