我想在Android的Delphi应用程序中保持屏幕显示。
我知道有两种方法:
使用窗口管理器和FLAG_KEEP_SCREEN_ON
使用"唤醒锁定"。
我遇到的问题是,我似乎无法获得WindowManager
个实例,更不用说从布局类中获取标志了,并且似乎没有定义唤醒锁(在至少在XE8中。
窗口标志似乎是最好的方式,但似乎没有办法成功。
有谁知道怎么做?
答案 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;