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

And*_*ský 4 qt android qtquick2 qtandroidextras

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

在此输入图像描述

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

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

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

a.t*_*aby 7

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

所以在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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

android {
    QT += androidextras
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android-sources
}
Run Code Online (Sandbox Code Playgroud)

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