我找到了一些如何在 Java 中做到这一点的解决方案,但没有找到如何在 QML 或 Qt 中做到这一点。我知道首先我应该在
WAKE_LOCK
中设置 AndroidManifest.xml
权限。我应该怎么做才能在运行时从 Qt 打开和关闭屏幕锁定?
window.callMethod<void>
代替 window.callObjectMethod
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();
}
});
}
您可以使用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);
AndroidManifest.xml 中还应添加 WAKE_LOCK 权限。
构建项目,它会正常工作。
伙计们。更新 psyched 对 Qt 6.7 的答案,经过测试的代码。在 android 13 上,我不需要在清单上包含特殊权限,但我不知道不包含它是否与旧的 android 版本兼容。
#include <QtCore/private/qandroidextras_p.h>
#include <QtCore/qjniobject.h>
void setKeepScreenOn(bool on) {
using QNativeInterface::QAndroidApplication;
QAndroidApplication::runOnAndroidMainThread([on] {
QJniObject activity = QtAndroidPrivate::activity();
if (activity.isValid()) {
QJniObject 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);
}
}
}
QJniEnvironment env;
if (env->ExceptionCheck()) {
env->ExceptionClear();
}
});
}