Android 系统版本很多,较新的 4.4 ,较老的 2.3 ,都有人用。 Qt on Android 开发的 Android 应用,默认在 Android 设备上是非全屏的。而有些应用的需求是全屏显示,比如游戏。那么怎么样才能做到这点呢?
我们需要分 Android 系统版本来说。
对于 4.0 以前,比如 2.2 、 2.3 的系统,可以修改 AndroidManifest.xml 文件来实现全屏。
首先需要为 Qt on Android 应用生成一个 AndroidManifest.xml 文件,具体参考《 Qt on Android:图文详解Hello World全过程》一文。创建 AndroidManifest.xml 的示意图如下:
点击上图中标号为 7 的那个按钮即可创建一个 AndroidManifest.xml 文件。该文件默认生成在 Qt 项目目录下的 android 子目录内。
然后需要打开 AndroidManifest.xml 文件,找到 Activity 标签,为其加入下面这个属性:
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
在 2.x 系统上运行你的 Qt on Android 应用吧,已经全屏了,连标题栏都没有了。
Android 系统版本到了 4.0 以后,前面那种设置活动主题的方式无效了。我们需要在 Java 代码中为 Activity 设置一个全屏的窗口标记。
这在 Java 撰写的 Android 应用上很简单,只需要在 Activity 的 onCreate() 方法中加入下面的代码:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
一步一步说吧,这次以我们的 Qt Quick App 为例来说明,先参考《Qt Quick 之 Hello World 图文详解》一文创建一个项目,我演示需要,还是以 HelloQtQuickApp 为基础修改的。
先看下修改前的效果图(我在 4.0.3 系统的机顶盒上运行):
注意到图片下方的状态栏了吧。
参考上一节吧,把 Activity 的 Theme 属性也设置一下。
话说 Qt on Android 应用, Qt 部分的代码以 JNI 的方式经由 Java 代码启动的。为了能够启动 Qt 代码,进入 Qt 的世界, Qt 框架提供了 QPA 层以及必要的 Activity 、 Application 实现。详情参考《Qt on Android Episode 1(翻译)》和《Qt for Android 部署流程分析》两篇文章。
这里以 Qt 5.2.0 为例来作一简单说明。
如果你观察 AndroidManifest.xml 文件,会发现里面的 Activity 标签,指定的 activity 名字是:"org.qtproject.qt5.android.bindings.QtActivity" 。没错,就是它!它是由 Qt 框架提供的,你 Qt on Android 应用的入口。 QtActivity 的位置在这里:
c:\qt\Qt5.2.0\5.2.0\android_armv5\src\android\java\src\org\qtproject\qt5\android\bindings\QtActivity.java
下面是 QtActivity.java 的 onCreate 函数的摘录:
...
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
try {
setTheme(Class.forName("android.R$style").getDeclaredField(QT_ANDROID_DEFAULT_THEME).getInt(null));
} catch (Exception e) {
e.printStackTrace();
}
if (Build.VERSION.SDK_INT > 10) {
try {
requestWindowFeature(Window.class.getField("FEATURE_ACTION_BAR").getInt(null));
} catch (Exception e) {
e.printStackTrace();
}
} else {
requestWindowFeature(Window.FEATURE_NO_TITLE);
}
...
}
...
你懂的, Qt Creator 可以编译 Java 源码(通过调用 Ant ), QtActivity 就是这样编译到你的 APK 中的。所以,我们也可以添加自己的 Java 代码喽。
我们要添加全屏标记,需要继承 QtActivity 类来实现一个新的 Activity 。当然如果你想粗暴地解决这个问题,可以直接修改 QtActivity.java ,直接加一行代码即可。什么代码?看下面。
QtFullscreenActivity 继承自 QtActivity 类,代码非常简单。如下:
package an.qt.helloQtQuickApp;
import android.content.Context;
import android.content.Intent;
import android.app.PendingIntent;
import android.util.Log;
import android.os.Bundle;
import android.view.WindowManager;
public class QtFullscreenActivity extends org.qtproject.qt5.android.bindings.QtActivity
{
private final static String TAG = "QtFullscreen";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
}
我把 QtFullscreenActivity.java 文件放在了 android/src/an/qt/helloQtQuickApp/ 下面,所以 pro 文件中相关的部分是酱紫的:
OTHER_FILES += \
android/AndroidManifest.xml \
android/src/an/qt/helloQtQuickApp/QtFullscreenActivity.java
然后你可以看到下面的项目视图了:
这是改动的最后一步了。
我们实现的 Activity 名字是 QtFullscreenActivity ,所以呢, AndroidManifest.xml 文件中也要修改,保持一致。见下面:
...
好啦,到此为止,全部改动就绪。运行我们的 HelloQtQuickApp 吧。
下面是现在运行的效果:
好啦,到此结束。
本系列的其他文章: