首页 文章

在Qt Quick中的Android上的常规共享按钮

提问于
浏览
4

在我的第一个目标平台是Android的基于Quick的快速应用程序中,我需要让用户共享图像 . 我的意思是Android上的一般分享行动,不仅限于任何特定的社交网络:

enter image description here

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

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

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

2 回答

  • 3

    就我而言 . 最好的,实际上唯一可行的方法是使用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();
    }
    

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

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

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

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

  • 7

相关问题