Qt on Android:添加分享功能

      前几天(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类

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ...  
  2. public class ShareIntent  
  3. {  
  4.     static public void shareText(String title, String subject,   
  5.                                  String content, QtActivity activity)  
  6.     {  
  7.         Intent share = new Intent(Intent.ACTION_SEND);  
  8.         share.setType("text/plain");  
  9.   
  10.         share.putExtra(Intent.EXTRA_SUBJECT, subject);  
  11.         share.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(content).toString());  
  12.         share.putExtra(Intent.EXTRA_HTML_TEXT, content);  
  13.         activity.startActivity(Intent.createChooser(share, title));  
  14.     }  
  15. }  
  16. ...  

在pro文件里添加androidextras模块

[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ...  
  2. QT += androidextras  
  3. ...  

通过 JNI 调用 Java 类的 Qt 类

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ...  
  2. void QtAndroidShare::share(const QString &title, const QString &subject, const QString &content)  
  3. {  
  4.     QAndroidJniObject jTitle = QAndroidJniObject::fromString(title);  
  5.     QAndroidJniObject jSubject = QAndroidJniObject::fromString(subject);  
  6.     QAndroidJniObject jContent = QAndroidJniObject::fromString(content);  
  7.     QAndroidJniObject activity = QtAndroid::androidActivity();  
  8.     QAndroidJniObject::callStaticMethod<void>(  
  9.         "net/exit0/androidshare/ShareIntent",  
  10.         "shareText",  
  11.         "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;"  
  12.               "Lorg/qtproject/qt5/android/bindings/QtActivity;)V",  
  13.         jTitle.object<jstring>(),  
  14.         jSubject.object<jstring>(),  
  15.         jContent.object<jstring>(),  
  16.         activity.object<jobject>()  
  17.    );  
  18. }  

    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 方法:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. Q_INVOKABLE virtual void share(const QString &title,  
  2.                                const QString &subject,  
  3.                                const QString &content);  

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

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ...  
  2. QQmlApplicationEngine engine;  
  3. QQmlContext *context = engine.rootContext();  
  4.   
  5. qmlRegisterType<QtAndroidShare>("QtAndroidShare", 1, 0, "ShareIntent");  
  6. context->setContextProperty("shareIntent"new QtAndroidShare());  
  7. ...  

在 QML 中使用

[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ...  
  2. Button {  
  3.     text: "Press to share"  
  4.     onClicked: {  
  5.         shareIntent.share(title.text, subject.text, content.text);  
  6.     }  
  7. }  
  8. ...  

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

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


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

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

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



    看起来效果还不错哦。


原博文网址:http://blog.csdn.net/foruok/article/details/45066349

原博文还有其他的QtAndroid链接,有需要的可以查看!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值