4

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

在此处输入图像描述

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

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

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

4

2 回答 2

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));
    }
}

所以在 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 源的目录。

于 2015-05-09T14:20:19.250 回答
4

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

于 2016-07-04T08:14:39.213 回答