You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt Android中startActivityForResult后handleActivityResult未回调问题排查

解决QAndroidActivityResultReceiver的handleActivityResult不回调问题

核心问题分析

你直接调用Android原生activity.startActivityForResult(),但Qt的QAndroidActivityResultReceiver需要通过Qt的API注册请求,才能让结果回调到你的Receiver实例。原生调用绕过了Qt的结果分发机制,所以handleActivityResult不会被触发。

具体修复步骤

1. 改用Qt官方API启动Activity并注册Receiver

修改callactivity.cpp中的runApplication方法,替换原生调用为Qt封装的API,同时传入当前Receiver实例:

#include <QtAndroid> // 需添加此头文件

void CallActivity::runApplication(const QString &packageName, const QString &className)
{
    QAndroidJniObject jPackageName = QAndroidJniObject::fromString(packageName);
    QAndroidJniObject jClassName = QAndroidJniObject::fromString(className);
    QAndroidJniObject intent("android/content/Intent","()V");
    intent.callObjectMethod("setClassName",
                            "(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;",
                            jPackageName.object<jstring>(),jClassName.object<jstring>());

    // 使用QtAndroid的API启动Activity并绑定当前Receiver
    QtAndroid::startActivity(intent, 1, this);
}

2. 保证Receiver实例的生命周期

确保CallActivity实例在第三方Activity返回结果前不会被销毁。比如在main.cpp中将其注册为QML全局上下文属性,避免临时对象被回收:

#include "callactivity.h"
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    CallActivity callActivity;
    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("clcallActivity", &callActivity);

    const QUrl url(u"qrc:/main.qml"_qs);
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}

3. 确保请求码唯一(可选)

检查请求码1是否被其他Qt请求占用,若有冲突,更换为唯一数值(如1001),防止结果被其他Receiver拦截。

原理说明

Qt Android框架对原生startActivityForResult做了封装,只有通过QtAndroid::startActivity传入QAndroidActivityResultReceiver实例,Qt的分发系统才会将结果定向到对应的handleActivityResult方法。直接调用原生方法时,Qt无法追踪你的Receiver,因此不会触发回调。

内容的提问来源于stack exchange,提问作者Artem Redko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 20:47:20