前几天(2015-4-15)看到老外的一篇文章,讲如何使用 Qt on Android 来向社交网络分享信息,使用 Qt 提供的 JNI 功能来实现,和我之前写的 QtAndroid 详解系列文章很搭啊,特此翻译过来。

原文在这里:Sharing with Qt on Android 。是 2014 年 12 月 12 日的文章,恨不相逢未嫁时……Sigh,又胡扯了……还是 Google 强大,可以搜索到好东西。

原文作者zagge ,译者foruok(http://blog.csdn.net/foruok),转载请注明出处。

-------------------------------分割线---------------------------------

我们刚刚发布了GiraffPanic(一款用Qt & QML 开发的逻辑类益智游戏。译者注:Google Play中可以下载到,收费) 的一个新版本。在这个新版本中,我们给用户提供了相互之间分享解锁密码(code)的机会以方便用户解锁新的关卡(levels)。我们想为不同的设备之间共享密码找一个友好的方式,不需要把密码拷贝粘贴到另外的应用中。尝试了多种途径(都没法正常工作)后,我们发现可以在我们的应用里直接调用 Android 原生的分享菜单。使用这种方式,既保持了我们代码的整洁,又能支持宿主设备所提供的所有共享方式。

使用那种共享方式,应用不需要任何特别的权限。

下面是最终效果(图片来自英文原文):



你可以在这里(gitorious.org)下载测试应用的示例代码。为了更容易理解,后面展示的代码特意做了简化。

好啦,我们都要做哪些工作呢?

调用Android原生API的Java类

    ...    public class ShareIntent    {        static public void shareText(String title, String subject,                                      String content, QtActivity activity)        {            Intent share = new Intent(Intent.ACTION_SEND);            share.setType("text/plain");            share.putExtra(Intent.EXTRA_SUBJECT, subject);            share.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(content).toString());            share.putExtra(Intent.EXTRA_HTML_TEXT, content);            activity.startActivity(Intent.createChooser(share, title));        }    }    ...

在pro文件里添加androidextras模块

    ...    QT += androidextras    ...

通过 JNI 调用 Java 类的 Qt 类

    ...    void QtAndroidShare::share(const QString &title, const QString &subject, const QString &content)    {        QAndroidJniObject jTitle = QAndroidJniObject::fromString(title);        QAndroidJniObject jSubject = QAndroidJniObject::fromString(subject);        QAndroidJniObject jContent = QAndroidJniObject::fromString(content);        QAndroidJniObject activity = QtAndroid::androidActivity();        QAndroidJniObject::callStaticMethod<void>(            "net/exit0/androidshare/ShareIntent",            "shareText",            "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;"                  "Lorg/qtproject/qt5/android/bindings/QtActivity;)V",            jTitle.object<jstring>(),            jSubject.object<jstring>(),            jContent.object<jstring>(),            activity.object<jobject>()       );    }

QAndroidJniObject是Qt提供的andoridextras 模块的一部分,简化了使用 JNI 调用 Java 方法的使用。首先我们把 QString 对象转换为 Java 方法需要的 Java String 对象。同时我们也把调用分享意图(Intent)的活动(Activity)对象传递过去。Java 方法 shareText 是静态的,因此我们可以使用QAndroidJniObject::callStaticMethod<void>() 来调用它。

callStaticMethod 方法的参数如下:

  • className - 代表了你要调用的 Java 方法所属的类,全限定类名
  • methodName - 你要调用的 Java 方法名字
  • signature - Java 方法的签名
  • parameters - 要传递的所有参数

Bogdan 在Qt on Android Episode 5一文中对 Qt 和 JNI 做了很好的概述。(译者注:可以参考我翻译的中文版本——Qt on Android Episode 5(翻译))。

让AndroidShare 类在 QML 中可用

为了让 AndroidShare 类在 QML 环境中可见,首先我们像下面这样声明 AndroidShare::share 方法:

    Q_INVOKABLE virtual void share(const QString &title,                                   const QString &subject,                                   const QString &content);

然后我们给 QQmlContext 添加一个 AndroidShare 的对象,作为 QML 上下文的一个属性:

    ...    QQmlApplicationEngine engine;    QQmlContext *context = engine.rootContext();    qmlRegisterType<QtAndroidShare>("QtAndroidShare", 1, 0, "ShareIntent");    context->setContextProperty("shareIntent", new QtAndroidShare());    ...

在 QML 中使用

    ...    Button {        text: "Press to share"        onClicked: {            shareIntent.share(title.text, subject.text, content.text);        }    }    ...

如你所见,QML 中的调用代码相当简单。

希望这篇文章对看到的人有所帮助。


要是你想看看代码在你游戏中运行的效果,可以到 Google Play 中下载。用黑莓的兄弟,看BlackBerry WorldN9(诺记的手机,是原文作者还在用的手机之一)的粉儿可以点这里下载。

译者注:Qt 跨平台的好处体现出来啦……

下面是游戏截图,译者foruok给的了:



看起来效果还不错哦。


博主的QtAndroid系列文章列出来供参考:

  • QtAndroid详解(5):JNI调用Android系统功能(2)
  • QtAndroid详解(4):JNI调用Android系统功能(1)
  • QtAndroid详解(3):startActivity实战Android拍照功能
  • QtAndroid详解(2):startActivity和它的小伙伴们
  • QtAndroid详解(1):QAndroidJniObject
  • Qt on Android专栏

更多相关文章

  1. Android(安卓)环信官方Demo3.3.2详细配置方法
  2. Android中如何使用JUnit进行单元测试
  3. Android横竖屏切换总结
  4. Android(安卓)文件操作详解及简单实例
  5. Unity3d与Android通信
  6. Android(安卓)JNI 调用
  7. Android使用自定义字体的方法
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. Bokeh中数据的添加、修改和筛选 | Bokeh
  2. Python英语-Issue08
  3. 这次简单多了,最新版 MongoDB 安装
  4. spring boot 上传文件到指定目录
  5. 第100篇原创,新的起点
  6. java 手写文字图片识别提取 百度API
  7. Python英语 - Issue13
  8. Bokeh中图形与组件的布局简介 | Bokeh 小
  9. 不再被坑,Jupyter Notebook 输出pdf并支持
  10. Python英语 - Issue14