我有Qt应用程序,需要在应用程序运行时防止屏幕变暗。我将以下代码放在main.cpp中main()的开头:
#ifdef ANDROID
// disable screen lock on android devices
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.callMethod<void>("addFlags", "(I)V", FLAG_KEEP_SCREEN_ON);
}
}
#endif
其中几乎来自:How to keep the screen on in Qt for android?,但我使用的是callMethod<void>
而不是callObjectMethod
。
问题是,当应用程序启动时,它会与巨大的Java日志崩溃,我怀疑这是它的相关部分:
F/art (26455): art/runtime/runtime.cc:289] Pending exception android.view.ViewRootImpl$CalledFromWrongThreadException thrown by 'unknown throw location'
F/art (26455): art/runtime/runtime.cc:289] android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
F/art (26455): art/runtime/runtime.cc:289] at void android.view.ViewRootImpl.checkThread() (ViewRootImpl.java:6357)
F/art (26455): art/runtime/runtime.cc:289] at void android.view.ViewRootImpl.requestLayout() (ViewRootImpl.java:874)
F/art (26455): art/runtime/runtime.cc:289] at void android.view.View.requestLayout() (View.java:17476)
F/art (26455): art/runtime/runtime.cc:289] at void android.view.View.setLayoutParams(android.view.ViewGroup$LayoutParams) (View.java:11477)
F/art (26455): art/runtime/runtime.cc:289] at void android.view.WindowManagerGlobal.updateViewLayout(android.view.View, android.view.ViewGroup$LayoutParams) (WindowManagerGlobal.java:305)
F/art (26455): art/runtime/runtime.cc:289] at void android.view.WindowManagerImpl.updateViewLayout(android.view.View, android.view.ViewGroup$LayoutParams) (WindowManagerImpl.java:91)
F/art (26455): art/runtime/runtime.cc:289] at void android.app.Activity.onWindowAttributesChanged(android.view.WindowManager$LayoutParams) (Activity.java:2596)
F/art (26455): art/runtime/runtime.cc:289] at void org.qtproject.qt5.android.bindings.QtActivity.onWindowAttributesChanged(android.view.WindowManager$LayoutParams) (QtActivity.java:1385)
F/art (26455): art/runtime/runtime.cc:289] at void android.view.Window.dispatchWindowAttributesChanged(android.view.WindowManager$LayoutParams) (Window.java:836)
F/art (26455): art/runtime/runtime.cc:289] at void com.android.internal.policy.impl.PhoneWindow.dispatchWindowAttributesChanged(android.view.WindowManager$LayoutParams) (PhoneWindow.java:3993)
F/art (26455): art/runtime/runtime.cc:289] at void android.view.Window.setFlags(int, int) (Window.java:813)
F/art (26455): art/runtime/runtime.cc:289] at void android.view.Window.addFlags(int) (Window.java:771)
我在AndroidManifest.xml中添加了适当的权限(android.permission.WAKE_LOCK)。问题似乎是由于在主视图之外运行addFlags()引起的?我用Google搜索了一下,找不到其他人有同样的问题。
谢谢, 伊万
答案 0 :(得分:1)
#!/bin/bash
cd ~/deploy
rm -R $( ls -td */ | tail -n 1 )
从here得到它,适用于我的5.1 android井
答案 1 :(得分:0)
在Android上部署时,Qt实际上并不在主应用程序(Java)线程中运行。由于必须从Java主线程调用android.view.Window.addFlags
,因此您很难回到此线程以使此代码有效。
最好是使用WakeLock
来阻止系统进入睡眠模式。 here is a post explaining how to do it
这可以防止屏幕在应用程序运行时变暗。
答案 2 :(得分:0)
我最终用Java做了这个。
这是java代码:
package org.qtproject.visualization;
import org.qtproject.qt5.android.bindings.*;
import android.os.Bundle;
import android.view.WindowManager;
public class ScreenOnActivity extends QtActivity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
getWindow().addFlags( WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON );
super.onCreate(savedInstanceState);
}
}
然后将其集成到应用程序的其余部分。