前几天(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)下载测试应用的示例代码。为了更容易理解,后面展示的代码特意做了简化。
好啦,我们都要做哪些工作呢?
... 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)); } } ...
... QT += androidextras ...
... 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>() ); }
callStaticMethod 方法的参数如下:
Bogdan 在 Qt on Android Episode 5 一文中对 Qt 和 JNI 做了很好的概述。(译者注:可以参考我翻译的中文版本——Qt on Android Episode 5(翻译))。
为了让 AndroidShare 类在 QML 环境中可见,首先我们像下面这样声明 AndroidShare::share 方法:
Q_INVOKABLE virtual void share(const QString &title, const QString &subject, const QString &content);
... QQmlApplicationEngine engine; QQmlContext *context = engine.rootContext(); qmlRegisterType<QtAndroidShare>("QtAndroidShare", 1, 0, "ShareIntent"); context->setContextProperty("shareIntent", new QtAndroidShare()); ...
... Button { text: "Press to share" onClicked: { shareIntent.share(title.text, subject.text, content.text); } } ...
希望这篇文章对看到的人有所帮助。
要是你想看看代码在你游戏中运行的效果,可以到 Google Play 中下载。用黑莓的兄弟,看 BlackBerry World ,N9(诺记的手机,是原文作者还在用的手机之一)的粉儿可以点这里下载。
译者注:Qt 跨平台的好处体现出来啦……
下面是游戏截图,译者foruok给的了:
看起来效果还不错哦。
博主的QtAndroid系列文章列出来供参考: