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类

    ...
    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 World ,N9(诺记的手机,是原文作者还在用的手机之一)的粉儿可以点这里下载。

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

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

看起来效果还不错哦。

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

时间: 2024-10-12 20:47:46

Qt on Android:添加分享功能的相关文章

Android微信分享功能实例+demo

Android微信分享功能实例 1 微信开放平台注册 2 获得appId,添加到程序中,并运行程序 3 使用应用签名apk生成签名,添加到微信开放平台应用签名,完成注册 4 测试分享功能. 有问题请留言  o(∩_∩)o 哈哈 代码如下: package com.wx; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import a

android 实现分享功能两种方法

当我想做一个智能的记事本的时候,我就在尝试自己写一组分享功能.后来才知道,原来每个社交软件中都有自己的分享接口. 这就大大减少了我们的代码量了. 第一种方法:特点--简单 package com.example.share; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuI

如何使用友盟 Cocos2d-x 分享组件实现 Android/iOS 分享功能

Cocos2d-x作为一款优秀的跨平台游戏引擎,已经被越来越多的开发者使用,而在游戏中使用分享组件能够有效的提供用户粘性,通过分享回流来提高APP安装量,但是目前市面上能够在Cocos2d-x环境下使用的分享插件并不多,开发者们只能自己对原生分享SDK进行封装来实现,前一段时间友盟推出Cocos2d-x分享组件,能够帮助开发者快速集成.友盟也把组件的源码放在GitHub上,有好的想法也可以直接在GitHub上修改(PS.在GitHub上提bug可以获得友盟的小奖品),同样也可以对源码进行学习,对

android一键分享功能不使用任何第三方sdk

在android中有自带的一键分享功能,不过它会把所有带分享的应用都找出来,如果我们只需要一些常见的分享应用,该如何做呢? 下面看我的效果图(横屏和竖屏自动适配): 接下来看我的调用(支持图片和文字分享,图片可以是网络图片,和本地sdcard路径的): 1 AndroidShare as = new AndroidShare( 2 MainActivity.this, 3 "哈哈---超方便的分享!!!来自allen", 4 "http://www.fjsen.com/ima

hexo next主题为博客添加分享功能

title: hexo next主题为博客添加分享功能 date: 2018-01-06 20:20:02 tags: [hexo博客, 博客配置] categories: hexo next主题配置 --- 今天心血来潮,决定给博客添加分享功能,百度上首先是找到了使用shareSDK的分享功能,最后在实践的过程中发现它添加时步骤比较多,添加完成后效果比较丑(就是一个长条的浅蓝色按钮),而且点击后想要退出分享比较麻烦(它的取消按钮实在太难找了,它在页面最下方的位置,呈现浅灰色,这个设计太反人类了

android 实现分享功能

1.新建share.xml布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent&q

Android开发分享功能实现步骤

参考mob官网(http://www.mob.com/) 分享实现步骤:1.mob官网账号注册登录2.进入后台,进入ShareSDK,添加应用,生成秘钥3.参照mob官网集成文档,下载SDK,进入ShareSDK for Android,双击打开QuickIntegrater.jar,替换自己写的工程名和包名4.将libs里面东西拷过去将src下面的cn和com放到java下面将res下面的东西拷过去将assets拷过去

为Unity开发的android手机游戏添加一个社会化分享功能

先看一下我最近自己做的一个游戏的效果图,然后在为大家讲述怎么做这样一个分享功能,如果图片不直观,当然如果你也不介意我顺便宣传一下我的游戏,你可以点击以下这个链接,下载我的游戏,进去体验一下里面的这个分享功能:http://zhushou.360.cn/detail/index/soft_id/2954399?recrefer=SE_D_BubbleDeer 好了,接下来我们就来一起探讨一下这个分享功能怎么做. (1)提供下载一个社会化分析的SDK,这个我用的是mob.com网的ShareSDK,

Android集成友盟社会化分享功能

1.  产品概述 友盟社会化组件,可以让移动应用快速具备社会化分享.登录.评论.喜欢等功能,并提供实时.全面的社会化数据统计分析服务. 指南将会手把手教你使用社会化组件SDK,用5分钟为APP增加新浪微博.腾讯微博.人人网分享功能. 注意:本文示例代码均针对最新版SDK,如果你所用SDK的类名或方法名与此文不符合,请使用你所用SDK的随包文档.或者下载使用最新版SDK. 2.  获取友盟Appkey 如果你之前已经在友盟注册了应用,并获取到了Appkey,可以继续使用它. 如果你尚未在友盟注册开