Qt on Android:添加分享功能,qtandroid

來源:互聯網
上載者:User

Qt on Android:添加分享功能,qtandroid

    前幾天(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系列文章列出來供參考:

  • QtAndroid詳解(5):JNI調用Android系統功能(2)
  • QtAndroid詳解(4):JNI調用Android系統功能(1)
  • QtAndroid詳解(3):startActivity實戰Android拍照功能
  • QtAndroid詳解(2):startActivity和它的小夥伴們
  • QtAndroid詳解(1):QAndroidJniObject
  • Qt on Android專欄

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.