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