最近抽空研究了下Qt 开发android应用 如何调用android api,发现其实我们还得写java代码,java代码主要实现功能,再使用Qt封装好的android类去调用
群内经常有人问到Qt如何调用android api,不知道是Qt官方给的例子太少,还是拿来主义在作怪,其实我在QtCreator找到了一个例子就是关于如何调用Android API的,它就是
例如基于我的安装Qt的目录得到的例子是C:\Qt\Qt5.2.1\5.2.1\mingw48_32\examples\androidextras下面有个notification的例子,就是Qt应用通过调用Android API将通知发送到
安卓的通知栏,不信大家可以试试,基于QML的一个应用。
基于这个例子我简单说下里面的内容
#include "notificationclient.h"
#include
NotificationClient::NotificationClient(QObject *parent)
: QObject(parent)
{
connect(this, SIGNAL(notificationChanged()), this, SLOT(updateAndroidNotification()));
}
void NotificationClient::setNotification(const QString ¬ification)
{
if (m_notification == notification)
return;
m_notification = notification;
emit notificationChanged();
}
QString NotificationClient::notification() const
{
return m_notification;
}
void NotificationClient::updateAndroidNotification()
{
QAndroidJniObject javaNotification = QAndroidJniObject::fromString(m_notification);
QAndroidJniObject::callStaticMethod<void>("org/qtproject/example/notification/NotificationClient",
"notify",
"(Ljava/lang/String;)V",
javaNotification.object());
}
updateAndroidNotification这个方法就是如何调用java文件的
CallStaticMethod<void>这个方面里面第一个参数是java文件的位置,第二个参数是这个java类的一个方法,第三个参数这个方法里面的参数类型,第四个就是方法里面的参数。
其实学过java,对这些应该了如指掌,我是java门外汉,呵呵,要用的时候去看下Android API的文章而已。
这个槽函数一调用就可以在真机或模拟器里面的通知栏看到Qt应用发的通知
下面我贴出java代码看看吧
package org.qtproject.example.notification;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
public class NotificationClient extends org.qtproject.qt5.android.bindings.QtActivity
{
private static NotificationManager m_notificationManager;
private static Notification.Builder m_builder;
private static NotificationClient m_instance;
public NotificationClient()
{
m_instance = this;
}
public static void notify(String s)
{
if (m_notificationManager == null) {
m_notificationManager = (NotificationManager)m_instance.getSystemService(Context.NOTIFICATION_SERVICE);
m_builder = new Notification.Builder(m_instance);
m_builder.setSmallIcon(R.drawable.icon);
m_builder.setContentTitle("A message from Qt!");
}
m_builder.setContentText(s);
m_notificationManager.notify(1, m_builder.build());
}
}
Java代码首先这个类就是类似Qt的继承QtActivity的java类,这个基础类安装目录里面找得到。
首先引入了安卓的管理通知的对象和某个通知对象。
其次 定义了一个静态方法就做notify,还传入了一个String的参数
里面的部分代码应该可以看懂,就是首先实例一个管理通知的对象,还是new一个通知对象
通知对象设置了各种属性和参数,比如setSmallIcon就是添加通知栏的一个图标,setContentTitle就是标题
setContentText就是设置通知的内容,自定义,其实标题也可以自定义
然后就是管理通知的对象发出通知
另外有人提到如何在Qt 安卓应用里面使得手机震动,我猜想肯定得调用安卓api
手机振动,例如:
notification.defaults |= Notification.DEFAULT_VIBRATE;
long[] vibrate = {0,100,200,300};
notification.vibrate = vibrate;
手机声音:
notification.defaults |= Notification.DEFAULT_SOUND;
notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3");
notification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6");
关于安卓一些附加额外的功能,可以参考Android 通知