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
相关产品推荐
相关产品推荐

