Qt编写Android App,调用Activity获得返回值

对于C++程序员来说使用Qt开发手机app不失为一个好的选择,当Qt不能满足要求时可以调用Android原生代码实现功能,由于Qt的帮助文档有限,相信不少Qt开发者也踩了不少坑

 

 

首先创建Qt工程

1.添加Android支持工程pro文件添加

QT += androidextras

2.编写Activity返回值类,派生于
QAndroidActivityResultReceiver,实现返回函数handleActivityResult,通过信号SendData将数据抛出去,代码如下:

ActivityResult .h 文件

#ifndef ACTIVITYRESULT_H

#define ACTIVITYRESULT_H

#include <QAndroidActivityResultReceiver>

class ActivityResult : public QObject,public QAndroidActivityResultReceiver

{

Q_OBJECT

signals:

void sendData(QString);

public:

int requestId;

ActivityResult(int id, QObject *parent = nullptr) : QObject(parent), requestId(id) {}

void handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject &data);

};

#endif // ACTIVITYRESULT_H

ActivityResult .cpp文件

#include <QDebug>

void ActivityResult::handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject &data)

{

if(receiverRequestCode == requestId)

{

if(resultCode ==-1)

{

QAndroidJniObject name=QAndroidJniObject::fromString("select");

QAndroidJniObject str = data.callObjectMethod("getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;",name.object<jstring>());

if(str==NULL)

{

emit sendData(tr("返回为空"));

return;

}

str.toString();

emit sendData(str.toString());

return;

}

else

{

//some code here

}

}

}

QT端调用代码

//调用Activity

void MainWindow::on_pushButton_clicked()

{

ActivityResult *m_ActivityResult;

QAndroidJniEnvironment env;

if(m_ActivityResult!=NULL)

{

delete m_ActivityResult;

}

m_ActivityResult = new ActivityResult(0);

connect(m_ActivityResult,SIGNAL(sendData(QString)),this,SLOT(sendData(QString)));//连接信号获得返回值

QtAndroid::runOnAndroidThread([=](){

QAndroidJniObject action =
QAndroidJniObject::fromString("org.qtproject.example.HelloWindow.XNActivity");//通用调用名称为org.qtproject.example.HelloWindow.XNActivity 保持和Java中要调用的Activity一致

QAndroidJniObject intent("android/content/Intent","(Ljava/lang/String;)V", action.object<jstring>());

QtAndroid::startActivity(intent, 0, m_ActivityResult);

});

}

void MainWindow::sendData(QString str)

{

QMessageBox::information(NULL, tr("提示"), str,QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);//弹窗显示返回的值

}

编译该工程将产生build-工程目录

用Android Studio打开该目录下的android-build

添加要调用的Activity

activity在AndroidManifest.xml中定义

<activity android:name=".XNActivity">

<intent-filter>

<action android:name="
org.qtproject.example.HelloWindow.XNActivity"/> <!--一定要指定通过名称调用-->

<category android:name="
android.intent.category.DEFAULT"/><!--一定要指定默认值-->

</intent-filter>

</activity>

XNActivity布局代码

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="#ff0000ff"

>

<Button

android:layout_width="match_parent"

android:text="@string/click"

android:layout_height="wrap_content"

android:id="@+id/mybt"

/>

</LinearLayout>

XNActivity.Java代码

package org.qtproject.example.HelloWindow;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import org.qtproject.qt5.android.bindings.QtActivity;

public class XNActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_xn);

findViewById(R.id.mybt).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent intent =new Intent(XNActivity.this, QtActivity.class);

intent.putExtra("select","123中华民族");//返回数据

setResult(Activity.RESULT_OK,intent);

finish();//结束当前Activity,返回上一个activity

}

});

}

}

现在再次编译工程运行,可以看到Activity返回串"123中华民族"

为避免Qt Java不不同数据类型转换的麻烦,可以采用传递json串方式解决

感谢你的支持下节将介绍使用Qt直接调用Java类

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值