uni-app 使用原生SDK时调用registerForActivityResult方法 发现其回调不执行 跑onActivityResult那里去了

uni-app 使用原生SDK时调用registerForActivityResult方法 发现其回调不执行 跑onActivityResult那里去了

信息类别 详细信息
产品分类 uni小程序SDK
手机系统 Android
手机系统版本号 Android 11
手机厂商 小米
手机机型 Xiaomi Redmi K20
页面类型 vue
SDK版本号 Android-SDK@3.2.16.81128_20211123

操作步骤:

registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {  
    @Override  
    public void onActivityResult(ActivityResult result) {  
        Log.d("TAG111111111", "期望回调执行");           
    }  
});

预期结果:

  • 回调执行 ActivityResultCallbackonActivityResult

实际结果:

  • 执行了 ActivityonActivityResult(int requestCode, int resultCode, Intent data)

bug描述:

调用 registerForActivityResult 方法, 发现其回调不执行;回调反而执行的 ActivityonActivityResult


更多关于uni-app 使用原生SDK时调用registerForActivityResult方法 发现其回调不执行 跑onActivityResult那里去了的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

onActivityResult不正是上一个页面返回后接收值的地方么

更多关于uni-app 使用原生SDK时调用registerForActivityResult方法 发现其回调不执行 跑onActivityResult那里去了的实战教程也可以访问 https://www.itying.com/category-93-b0.html


registerForActivityResult那里执行的 宿主进程还是小程序进程

宿主

回复 1***@139.com: 如果是宿主调用的代码那与小程序SDK有什么关系呢

这个问题是由于 uni-app 的 Android 原生容器与 AndroidX Activity Result API 的兼容性问题导致的。

在 uni-app 的 Android 原生开发中,SDK 使用的是自定义的 UniActivity 作为基础 Activity。这个 UniActivity 重写了 onActivityResult 方法,用于处理 uni-app 框架内部的事件传递。当你在 uni-app 的原生插件或 SDK 中调用 registerForActivityResult 时,AndroidX 的 Activity Result API 会尝试注册一个结果回调,但 uni-app 的 UniActivity 可能没有完全适配 AndroidX 的这套新 API 机制。

具体原因:

  1. registerForActivityResult 依赖于 ActivityResultRegistry,而 uni-app 的 UniActivity 可能没有正确初始化或支持这个 registry。
  2. uni-app 的 onActivityResult 方法被重写后,可能会拦截或影响 AndroidX Activity Result API 的正常回调流程。

解决方案:

方案一:使用传统的 startActivityForResult 方式(推荐)

// 定义 request code
private static final int REQUEST_CODE = 1001;

// 启动 Activity
startActivityForResult(intent, REQUEST_CODE);

// 在 Activity 中重写 onActivityResult
[@Override](/user/Override)
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE) {
        // 处理结果
        if (resultCode == RESULT_OK) {
            // 处理成功结果
        }
    }
}
回到顶部