【问题标题】:General Share button on Android in Qt QuickQt Quick 中 Android 上的常规共享按钮
【发布时间】:2015-05-08 16:33:06
【问题描述】:

在我的第一个目标平台是 Android 的基于 Qt Quick 的应用程序中,我需要使用户能够共享图像。我指的是 Android 上的一般分享操作,它不限于任何特定的社交网络:

我确实从 Qt 中找到了一些关于在 FB 和 Twitter 上分享的线程,但它们直接使用 Facebook/Twitter API,这不是我想要的。

从我目前发现的情况来看,似乎没有跨平台的方法可以做到这一点,我的应用程序可能必须包含一些 Java 代码。如果这是正确的,那么目前在 Android 上编写特定于平台的代码的正确方法是什么?喜欢this

另一个想法是,可以通过在WebView 加载的网站中运行的 Javascript 调用共享操作。由于网络应用程序具有共享功能,这应该是可能的,并且可能更跨平台。这看起来合理吗?

【问题讨论】:

    标签: android qt qtquick2 qtandroidextras


    【解决方案1】:

    就我而言。最好的也是唯一实用的方法是使用 Jni。乍一看似乎很混乱,但如果你有一点 java 经验,你肯定可以做到。

    为了将文本发送到另一个应用程序,如 facebook,我们应该使用 Intents。所以我们可以简单地在一个简单的 Java 文件中完成这项工作,并使用 Jni 从 c++ 端调用它。这是 SendIntent.java 文件的内容。该类有一个静态成员函数,它提供上下文并启动 Intent。然后它将文本数据发送到新活动。

    package com.example.android.tools;
    
    import android.app.Activity;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    
    public class SendIntent {
        public static void sendText(Activity context,String text) {
            Intent sendIntent = new Intent();
            sendIntent.setAction(Intent.ACTION_SEND);
            sendIntent.putExtra(Intent.EXTRA_TEXT, text);
            sendIntent.setType("text/plain");
            context.startActivity(Intent.createChooser(sendIntent, text));
        }
    }
    

    所以在c++端我们只需要启动一个android活动并将它传递给这个类:这是c++代码:

    void example::shareText(QString str)
    {
        QAndroidJniEnvironment _env;
        QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");   //activity is valid
        if (_env->ExceptionCheck()) {
            _env->ExceptionClear();
            throw InterfaceConnFailedException();
        }
        if ( activity.isValid() )
        {
            QAndroidJniObject::callStaticMethod<void>("com/example/android/tools/SendIntent","sendText","(Landroid/app/Activity;Ljava/lang/String;)V",activity.object<jobject>(),QAndroidJniObject::fromString(str).object<jstring>());
            if (_env->ExceptionCheck()) {
                _env->ExceptionClear();
                throw InterfaceConnFailedException();
            }
        }else
            throw InterfaceConnFailedException();
    }
    

    如果您担心跨平台问题,您可以使用 Preprocessor 指令编写平台相关代码,这是 c++ 编程中非常常见的解决方案。

    最后我要提到的是将这些代码行添加到 .pro 文件中。所以qt也能找到java资源:

    android {
        QT += androidextras
    ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android-sources
    }
    

    在这种情况下,android-sources 是我放置所有 java 源的目录。

    【讨论】:

      【解决方案2】:

      我希望这篇文章也对您有所帮助: http://blog.lasconic.com/share-on-ios-and-android-using-qml/

      【讨论】:

        猜你喜欢
        • 2019-12-24
        • 1970-01-01
        • 2018-12-10
        • 1970-01-01
        • 1970-01-01
        • 2018-05-04
        • 2014-07-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多