Qt 6.7开发Android Messenger:如何与其他应用交互及调用系统功能
替代AndroidJNI的Qt Android交互方案
一、复用Qt Android Extras模块
Qt6.7的AndroidJniObject并未被移除,只是官方文档说明不全。你可以直接沿用旧逻辑,注意Qt6的模块引入方式即可:
- 在CMakeLists.txt中添加依赖:
find_package(Qt6 REQUIRED COMPONENTS AndroidExtras) target_link_libraries(your_app_name PRIVATE Qt6::AndroidExtras) - 代码中引入头文件并调用:
#include <QtAndroidExtras/QtAndroidExtras> // 获取上下文并调用ContentResolver查询联系人 QAndroidJniObject context = QtAndroid::androidContext(); QAndroidJniObject contentResolver = context.callObjectMethod( "getContentResolver", "()Landroid/content/ContentResolver;" ); // 后续按Java层逻辑查询联系人数据即可
核心API和Qt5时期差异不大,可参考Qt6早期版本的AndroidExtras文档补全细节。
二、封装QML原生扩展
如果更偏向QML层调用,可通过自定义插件封装Android原生逻辑:
- 编写Java类继承
QtActivity,实现联系人查询、相机调用等原生方法 - 通过JNI注册将Java方法暴露给C++层
- 在C++中注册QML类型,让QML直接调用封装好的功能
三、用Intent调用系统应用
对于相机、联系人这类系统功能,无需自己实现全量逻辑,直接调用系统应用即可:
- 获取联系人:启动系统联系人选择器,回调中获取结果
QAndroidJniObject intent("android/content/Intent", "(Ljava/lang/String;)V", QAndroidJniObject::fromString("android.intent.action.PICK").object<jstring>()); intent.callObjectMethod("setType", "(Ljava/lang/String;)Landroid/content/Intent;", QAndroidJniObject::fromString("vnd.android.cursor.dir/phone_v2").object<jstring>()); QtAndroid::startActivity(intent.object<jobject>(), 1001, [](int resultCode, const QAndroidJniObject &data) { if (resultCode == QtAndroid::ActivityResultOk) { QAndroidJniObject uri = data.callObjectMethod("getData", "()Landroid/net/Uri;"); // 解析uri中的联系人信息 } }); - 相机/麦克风:通过Intent调用系统相机拍照/录制,直接获取返回的媒体文件路径
四、补充参考资源
除了你已查阅的文档,还可以重点看这些内容:
- Qt6的
Android Native Interface文档,聚焦JNI交互底层逻辑 - Qt Creator示例库中的
Android Contacts示例,直接参考适配Qt6的实现 - Qt社区论坛的Qt6 Android交互讨论,很多开发者分享了踩坑后的适配方案
内容的提问来源于stack exchange,提问作者TheBlackSwan994
相关产品推荐
相关产品推荐

