Изменение ориентации конкретной страницы в Android

Я работаю над приложением для Android в Qt и C++. Все мое приложение имеет книжную ориентацию. Но когда я играю видео, я хочу изменить ориентацию на альбомную, и после окончания видео она должна снова измениться на книжную.

Таким образом, вопрос в том, как можно настроить экран на альбомный или портретный режим в приложении Qt/C++ для Android.

2 ответа

Решение

Ориентация экрана на Android может быть изменена с помощью setRequestedOrientation Java-функция, поэтому вы должны вызывать Java-функцию из вашего приложения. Для запуска кода Java в вашем приложении Qt Android вы должны использовать модуль Qt Android Extras, который содержит дополнительные функциональные возможности для разработки на Android.

Вы можете использовать JNI для вызова функции Java из C/C++ или для обратного вызова функции C/C++ из Java.

Здесь вы можете использовать его в статическом Java-методе, например:

package com.MyApp;

public class OrientationChanger
{
    public static int change(int n)
    {
        switch(n)
        {
               case 0:
                   setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                   break;
               case 1:
                   setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                   break;                   
           }
    }
}

Сначала вам нужно добавить это в ваш.pro файл:

QT += androidextras

И включите соответствующий заголовочный файл:

#include <QAndroidJniObject>

Затем вы можете вызвать эту статическую функцию Java из вашего кода C++.

Чтобы изменить ориентацию на ландшафтный режим:

bool retVal = QAndroidJniObject::callStaticMethod<jint>
                        ("com/MyApp/OrientationChanger" // class name
                        , "change" // method name
                        , "(I)I" // signature
                        , 0);

Чтобы изменить ориентацию на портретный режим:

bool retVal = QAndroidJniObject::callStaticMethod<jint>
                        ("com/MyApp/OrientationChanger" // class name
                        , "change" // method name
                        , "(I)I" // signature
                        , 1);

Вам не нужно вызывать его через код Java. Вы можете напрямую вызвать его из C++, используя JNI следующим образом:

void MyAndroidHelperClass::setScreenOrientation(int orientation)
{
    QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");
    if ( activity.isValid() )
    {
        activity.callMethod<void>
                ("setRequestedOrientation" // method name
                 , "(I)V" // signature
                 , orientation);
    }
}
Другие вопросы по тегам