And*_*ský 4 qt android qtquick2 qtandroidextras
在我的Qt基于Quick的应用程序中,其第一个目标平台是Android,我需要让用户共享图像.我的意思是Android上的一般分享行动,不仅限于任何特定的社交网络:
我确实找到了一些关于在Qt上分享FB和Twitter的线索,但他们直接使用Facebook/Twitter API,这不是我想要的.
从我到目前为止发现,似乎没有跨平台的方法来做这个,我的应用程序可能必须包含一些Java代码.如果这是正确的,那么目前在Android上编写特定于平台的代码的正确方法是什么?喜欢这个?
另一个想法是,可以通过在WebView中加载的网站中运行的Javascript来调用共享操作.由于网络应用程序具有共享功能,因此这应该是可能的,可能更具跨平台性.这看起来合情合理吗?
就我而言.最好的,实际上唯一可行的方法是使用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源的目录.
归档时间: |
|
查看次数: |
1382 次 |
最近记录: |