2

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

どれがほとんどのものから来ましたか: 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() がメイン ビューの外で実行されているために問題が発生しているようです。

ありがとう、イヴァン

4

3 に答える 3

2
#if defined(Q_OS_ANDROID)
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);
    }
    QAndroidJniEnvironment env; if (env->ExceptionCheck()) { env->ExceptionClear(); } //Clear any possible pending exceptions.
}
#endif

hereから入手しました。5.1 androidでうまく機能します

于 2015-12-23T05:52:17.023 に答える
1

代わりに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);
    }
}

これは、アプリケーションの残りの部分に統合されます。

于 2016-02-03T07:34:21.597 に答える