Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Qt on Android:添加分享功能

Qt on Android:添加分享功能

編輯:關於Android編程

 

原文在這裡:Sharing with Qt on Android 。是 2014 年 12 月 12 日的文章,恨不相逢未嫁時……Sigh,又胡扯了……還是 Google 強大,可以搜索到好東西。

 

我們剛剛發布了 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(
            net/exit0/androidshare/ShareIntent,
            shareText,
            (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;
                  Lorg/qtproject/qt5/android/bindings/QtActivity;)V,
            jTitle.object(),
            jSubject.object(),
            jContent.object(),
            activity.object()
       );
    }

QAndroidJniObject是Qt提供的 andoridextras 模塊的一部分,簡化了使用 JNI 調用 Java 方法的使用。首先我們把 QString 對象轉換為 Java 方法需要的 Java String 對象。同時我們也把調用分享意圖(Intent)的活動(Activity)對象傳遞過去。Java 方法 shareText 是靜態的,因此我們可以使用 QAndroidJniObject::callStaticMethod() 來調用它。

 

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, 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給的了:

/

 

看起來效果還不錯哦。

  •  

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved