推送是我们开发移动应用经常用到的功能,Qt on Android 应用也会用到,之前也有朋友问过,这次我们来看看怎么在 Qt on Android 应用中来集成来自腾讯的信鸽推送。
有关信鸽的 SDK 和集成指南,请到这里(http://xg.qq.com/)查看。本文是参考腾讯信鸽的在线帮助完成的。信鸽的 WIKI 和文档已经做得很好了,照着做就是,这里只讲 Qt 中集成信鸽时的步骤和注意事项。
这次我们要写一点点 Java 代码,就几行,如何做,可以参考《Qt on Android核心编程》一书,也可以参考我博客上的文章“Qt on Android:使用JNI与第三方jar包”。下面我就开讲了。
我使用 Qt SDK 5.3.1 ,在 Windows 平台上开发,信鸽版本 2.37 。
信鸽SDK
信鸽的 SDK 可以在 http://xg.qq.com/ 这里下载到。
信鸽的快速集成指南:点我去看啦。
这里如何快速集成就不说了,人家说得很明白。
Qt on Android集成信鸽
这里是本文的重点。
我创建了一个简单的 Qt QWidgets App ,项目名字是 xgPushDemo ,具体过程略去,参考《Qt on Android核心编程》或者“Qt on Android:图文详解Hello World全过程”。
AndroidManifest.xml
必须创建 AndroidManifest.xml 文件,这个可以用 Qt Creator 来完成。
包名与图标
创建之后,修改包名为 an.qt.xgPushDemo 。这个包名,我们在 xg.qq.com 上要用到,你在 xg 上创建应用时需要指定包名,必须和这里一致。
给你的应用指定一个图标,必须的,否则信鸽推送通知时,找不到应用图标,显示不出来。
好啦,下面是我的配置,供参考:
图 1 Qt Creator中修改AndroidManifest.xml
如图1所示,我改了包名,也设置了应用图标(偷信鸽demo的图标)。
信鸽的配置
接下来还要在 AndroidManifest.xml 中给信鸽增加一些配置,下图供参考:
图 2 为信鸽配置 AndroidManifest.xml
如图2所示,我标注了三处必须修改的地方,请注意。
还有一些权限的配置,我没有列出来,直接拷贝信鸽快速集成指南里的说明即可。
Actvitiy配置
实际上我们这次要引入一个 Java 文件,定义了一个名为 QtPushDemoActivity 的类来作为我们应用的入口 Activity 。对应的,也需要修改 AndroidManifest.xml 文件。请打开 AndroidManifest.xml 文件,切换到 “XML Source” 模式直接修改,找到 <activity>标签,把 “andorid:name” 这个属性,修改为:
android:name="an.qt.xgPushDemo.QtPushDemoActivity"
嗯,就这样,原来是 QtActivity ,使用 Qt 提供的 Activity 作为应用入口,我们修改为 QtPushDemoActivity 这个我们自己写的 Activity ,后面会讲到。
信鸽SDK的jar文件
信鸽 SDK 解压后,打开 “Xg-Push-SDK-Android-2.37\Xg-Push-SDK-Android\libs” 目录。如下图:
图3 信鸽SDK里的jar文件
我用红线标注的三个 jar 文件,必须要拷贝到我们的项目目录下。
android-support-v4.jar也拷贝一下。
我们创建了 AndroidManifest.xml 后,在项目根目录下会生成名为 Android 的文件夹,jar文件请拷贝到 android/libs 目录下。如下图所示:
图4 Qt项目目录下的jar文件
注意,Qt项目下的android目录内,默认没有 libs 子目录,自己建一个即可。
信鸽so文件
信鸽除了 jar 文件,还有两个 so 文件,必须要拷贝到Qt项目目录下。
so在“Xg-Push-SDK-Android-2.37\Xg-Push-SDK-Android\All-Platforms-SO”目录下,如图:
图5 信鸽so文件
如图5所示,直接把 armeabi 和 armeabi-v7a 都拷贝到 Qt 项目目录下。拷贝完成后如下图所示:
图6 Qt项目下的libs目录
好啦,集成信鸽SDK需要的文件就搞完了。关于 jar 、 so 等文件,我们只要按照这种目录结构放在那里,Qt Creator在编译、部署时就会把它们打包到APK中,而我们在 Java 代码中也可以直接访问它们。
注册service
要使用信鸽,必须在你的应用启动后注册service。这个动作要在 Java 代码中完成。
还记得我们的包名——“an.qt.xgPushDemo”——吗?进入项目目录下的 android 文件下,建立 “src\an\qt\xgPushDemo” 这样的目录层次,新建一个 QtPushDemoActivity.java文件。然后目录看上去是酱紫的:
图7 添加java文件
如图7所示,我们添加了一个QtPushDemoActivity.java文件。Java 源文件名和类名是必须一致的,所以,我们这里的 Activity 名字就是 QtPushDemoActivity ,而 src 文件夹内的目录结构,和包名又是一致的,“an/qt/xgPushDemo”对应 Java 代码里的包名为“an.qt.xgPushDemo”,就是我们之前修改 AndroidManifest.xml 时定的那个包名。
好啦,来看 QtPushDemoActivity.java 的内容:
package an.qt.xgPushDemo; import org.qtproject.qt5.android.bindings.QtActivity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.util.Log; import com.tencent.android.tpush.XGIOperateCallback; import com.tencent.android.tpush.XGPushConfig; import com.tencent.android.tpush.XGPushManager; public class QtPushDemoActivity extends QtActivity { private final static String TAG = "xgPushDemo"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Context ctx = getApplicationContext(); XGPushManager.registerPush(ctx, new XGIOperateCallback() { @Override public void onSuccess(Object o, int i) { Log.e(TAG, "register ok, token - " + o); } @Override public void onFail(Object o, int i, String s) { Log.e(TAG, "register failed, code - " + i + " message - " + s); } }); } }
很简单,我们从 QtActivity 继承,重写了 onCreate 方法,加入注册信鸽服务的代码。
Qt on Android 应用可以直接集成 java 代码,只要把代码放到与包名对应的目录结构下即可,无需在 pro 文件内做任何改动。
这里需要提一下,作为 Qt on Android 应用入口的 Activity,必须从 QtActivity 继承,这是因为 QtActivity 这个类完成了从 Java 过渡到 Qt 的动作,不用它,我们的 Qt 世界就无法呈现出来。关于这一点,具体的分析,请看《Qt on Android核心编程》的第13章——“Qt on Android揭秘”。
好啦,现在一切就绪,我们可以跑跑看喽。
运行效果
如果你运行 xgPushDemo 示例,看到的界面如下:
图 8 xgPushDemo的丑样
图8说,我很丑,可是我很温柔,别听它的,它就是个摆设。我们要看的是推送哦。
呐,注意到我在 QtPushDemoActivity 的 onCreate 方法里的打印信息了吗?如果你运行示例,应该看到类似下面的输入:
图 9 注册信鸽服务成功
看到图9的信息,说明我们注册信鸽服务成功了!天才第一步,雀氏纸尿裤。哦,太激动了,现在用不着纸尿裤了。接下来就可以登录 xg.qq.com ,给应用推送通知了。
怎么登录?怎么推送?亲,信鸽的快速集成指南:点我去看啦。
我们这里可以看到效果如下:
图10 推送效果
嘿嘿,看到通知消息前面有个图标了吧,那是我偷信鸽Demo的,应用列表里也有呢,你看:
图11 应用列表
咦,这家伙很懒,应用名字都木改!不过如果你想改,去看“Qt on Android 之设置应用名为中文”吧。
好咧,在 Qt on Android 应用中集成信鸽推送,就讲到这里了。有了上面介绍的知识,常规的推送通知已经木问题了,哪怕你应用退出了,也可以收到服务端推送的通知,用户点击通知栏里的消息,就可以启动你的应用哦。
回顾一下:
- QtAndroid详解(5):JNI调用Android系统功能(2)
- QtAndroid详解(4):JNI调用Android系统功能(1)
- QtAndroid详解(3):startActivity实战Android拍照功能
- QtAndroid详解(2):startActivity和它的小伙伴们
- QtAndroid详解(1):QAndroidJniObject
- Qt on Android专栏