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專欄