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

迁移至Expo后Android端出现RuntimeException交付结果失败求助

问题:Expo迁移后Android端Crashlytics出现Already resumed错误(关联expo-image-picker)

迁移应用至Expo后,仅Android端在Crashlytics中捕获到如下崩溃错误:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1638309729, result=-1, data=Intent { flg=0x1 clip={image/* video/* U:content://media/external/file/695} }} to activity {MY-APP-SCHEME/MY-APP-SCHEME.MainAc

经排查怀疑与expo-image-picker相关,但已确认权限配置及API实现均无问题,团队在模拟器和真机上均无法复现该问题,求相关排查思路。

完整错误堆栈如下:

at android.app.ActivityThread.deliverResults(ActivityThread.java:5341)
       at android.app.ActivityThread.handleSendResult(ActivityThread.java:5380)
       at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:54)
       at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2247)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loopOnce(Looper.java:201)
       at android.os.Looper.loop(Looper.java:288)
       at android.app.ActivityThread.main(ActivityThread.java:7886)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:568)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1045)
Caused by java.lang.IllegalStateException: Already resumed
       at kotlin.coroutines.SafeContinuation.resumeWith(SafeContinuationJvm.kt:44)
       at expo.modules.kotlin.activityresult.AppContextActivityResultLauncher$launch$2$1.onActivityResult(AppContextActivityResultLauncher.kt:26)
       at expo.modules.kotlin.activityresult.AppContextActivityResultRegistry.doDispatch(AppContextActivityResultRegistry.kt:317)
       at expo.modules.kotlin.activityresult.AppContextActivityResultRegistry.dispatchResult(AppContextActivityResultRegistry.kt:295)
       at expo.modules.kotlin.activityresult.ActivityResultsManager.onActivityResult(ActivityResultsManager.kt:52)
       at expo.modules.kotlin.AppContext.onActivityResult$expo_modules_core_release(AppContext.kt:337)
       at expo.modules.kotlin.ReactLifecycleDelegate.onActivityResult(ReactLifecycleDelegate.kt:33)
       at com.facebook.react.bridge.ReactContext.onActivityResult(ReactContext.java:375)
       at com.facebook.react.ReactInstanceManager.onActivityResult(ReactInstanceManager.java:809)
       at com.facebook.react.ReactDelegate.onActivityResult(ReactDelegate.java:148)
       at com.facebook.react.ReactActivityDelegate.onActivityResult(ReactActivityDelegate.java:145)
       at expo.modules.ReactActivityDelegateWrapper.onActivityResult(ReactActivityDelegateWrapper.kt:223)
       at com.facebook.react.ReactActivity.onActivityResult(ReactActivity.java:70)
       at android.app.Activity.dispatchActivityResult(Activity.java:8381)
       at android.app.ActivityThread.deliverResults(ActivityThread.java:5334)
       at android.app.ActivityThread.handleSendResult(ActivityThread.java:5380)
       at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:54)
       at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2247)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loopOnce(Looper.java:201)
       at android.os.Looper.loop(Looper.java:288)
       at android.app.ActivityThread.main(ActivityThread.java:7886)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:568)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1045)

排查思路
  • 升级依赖版本:Already resumed异常多由Expo模块内部协程重复恢复的bug导致,优先升级expo-image-picker至最新稳定版,同步升级Expo SDK到兼容版本,旧版本的ActivityResult处理逻辑存在此类问题。
  • 避免重复调用:检查是否存在快速连续触发图片选择的场景(比如重复点击按钮),未等待上一次选择结果返回就发起新请求会导致协程重复恢复。可以添加状态锁,比如用isPickerActive变量标记请求状态,请求开始时设为true,结果返回或取消后设为false,禁止并发请求。
  • 模拟后台回收场景:无法复现可能是未测试应用被系统回收后的恢复流程。开启开发者选项中的“不保留活动”,切换到相册时应用会被销毁,返回后观察是否触发崩溃——这种场景下Expo协程状态可能丢失,导致恢复时异常。
  • 检查Activity配置:若自定义过MainActivity或修改了AndroidManifest中的launchMode(比如singleInstance/singleTask),需恢复为Expo默认配置测试,特殊启动模式可能导致Activity结果传递逻辑混乱。
  • 添加异常捕获与日志:在调用expo-image-picker的代码处添加try-catch捕获IllegalStateException,避免崩溃扩散;同时在Crashlytics中添加自定义日志,记录调用时的应用状态、设备信息,定位特定触发场景。
  • 确认权限申请时机:确保权限申请完成并返回允许后,再调用图片选择API,避免权限请求的回调与图片选择请求冲突,导致ActivityResult处理逻辑混乱。

内容的提问来源于stack exchange,提问作者Dean Elliott

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 14:19:58