首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt Quick中Android上的通用共享按钮

Qt Quick中Android上的通用共享按钮
EN

Stack Overflow用户
提问于 2015-05-09 00:33:06
回答 2查看 1.9K关注 0票数 4

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

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2015-05-09 22:20:19

据我所知。最好的,实际上也是唯一实用的方法是使用Jni。乍一看,这似乎非常令人困惑,但如果你有一点java经验,你肯定能做到。

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

代码语言:javascript
复制
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));
    }
}

因此,在android端,我们只需要启动一个c++活动并将其传递给这个类:下面是c++代码:

代码语言:javascript
复制
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资源:

代码语言:javascript
复制
android {
    QT += androidextras
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android-sources
}

在本例中,android-source是我放置所有java源代码的目录。

票数 7
EN

Stack Overflow用户

发布于 2016-07-04 16:14:39

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30128718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档