如何在 Qt for android 中保持屏幕打开?
How to keep the screen on in Qt for android?
我找到了几个如何在 Java 中执行此操作的解决方案,但没有找到如何在 QML 或 Qt 中执行此操作的方法。我知道首先我应该在 AndroidManifest.xml
中设置 WAKE_LOCK
权限。我应该怎么做才能在运行时从 Qt 打开和关闭屏幕锁定?
您可以使用 the Qt Android Extras 模块并使用 JNI 从 C++ 调用相关的 Java 函数。像 :
void keepScreenOn()
{
QAndroidJniObject activity = QtAndroid::androidActivity();
if (activity.isValid()) {
QAndroidJniObject window = activity.callObjectMethod("getWindow", "()Landroid/view/Window;");
if (window.isValid()) {
const int FLAG_KEEP_SCREEN_ON = 128;
window.callObjectMethod("addFlags", "(I)V", FLAG_KEEP_SCREEN_ON);
}
}
}
您可以通过编辑 qt 本身使用的 java 文件来实现。在 android 路径中的 src 下的安装路径中,您将找到 QtActivity.java 文件。在 onCreate 函数中添加以下行
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
WAKE_LOCK 中的 AndroidManifest.xml 权限也应添加。
构建项目,它将正常工作。
- 使用
window.callMethod<void>
代替window.callObjectMethod
- 运行 在 GUI 线程上
QtAndroid::runOnAndroidThread
- 之后清除异常
- 要禁用始终开启行为,请使用
clearFlags
这是经过测试的 Qt 5.7 代码:
void keep_screen_on(bool on) {
QtAndroid::runOnAndroidThread([on]{
QAndroidJniObject activity = QtAndroid::androidActivity();
if (activity.isValid()) {
QAndroidJniObject window =
activity.callObjectMethod("getWindow", "()Landroid/view/Window;");
if (window.isValid()) {
const int FLAG_KEEP_SCREEN_ON = 128;
if (on) {
window.callMethod<void>("addFlags", "(I)V", FLAG_KEEP_SCREEN_ON);
} else {
window.callMethod<void>("clearFlags", "(I)V", FLAG_KEEP_SCREEN_ON);
}
}
}
QAndroidJniEnvironment env;
if (env->ExceptionCheck()) {
env->ExceptionClear();
}
});
}
我找到了几个如何在 Java 中执行此操作的解决方案,但没有找到如何在 QML 或 Qt 中执行此操作的方法。我知道首先我应该在 AndroidManifest.xml
中设置 WAKE_LOCK
权限。我应该怎么做才能在运行时从 Qt 打开和关闭屏幕锁定?
您可以使用 the Qt Android Extras 模块并使用 JNI 从 C++ 调用相关的 Java 函数。像 :
void keepScreenOn()
{
QAndroidJniObject activity = QtAndroid::androidActivity();
if (activity.isValid()) {
QAndroidJniObject window = activity.callObjectMethod("getWindow", "()Landroid/view/Window;");
if (window.isValid()) {
const int FLAG_KEEP_SCREEN_ON = 128;
window.callObjectMethod("addFlags", "(I)V", FLAG_KEEP_SCREEN_ON);
}
}
}
您可以通过编辑 qt 本身使用的 java 文件来实现。在 android 路径中的 src 下的安装路径中,您将找到 QtActivity.java 文件。在 onCreate 函数中添加以下行
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
WAKE_LOCK 中的 AndroidManifest.xml 权限也应添加。
构建项目,它将正常工作。
- 使用
window.callMethod<void>
代替window.callObjectMethod
- 运行 在 GUI 线程上
QtAndroid::runOnAndroidThread
- 之后清除异常
- 要禁用始终开启行为,请使用
clearFlags
这是经过测试的 Qt 5.7 代码:
void keep_screen_on(bool on) {
QtAndroid::runOnAndroidThread([on]{
QAndroidJniObject activity = QtAndroid::androidActivity();
if (activity.isValid()) {
QAndroidJniObject window =
activity.callObjectMethod("getWindow", "()Landroid/view/Window;");
if (window.isValid()) {
const int FLAG_KEEP_SCREEN_ON = 128;
if (on) {
window.callMethod<void>("addFlags", "(I)V", FLAG_KEEP_SCREEN_ON);
} else {
window.callMethod<void>("clearFlags", "(I)V", FLAG_KEEP_SCREEN_ON);
}
}
}
QAndroidJniEnvironment env;
if (env->ExceptionCheck()) {
env->ExceptionClear();
}
});
}