使用registerForActivityResult调起邮件后RESULT_OK回调未触发问题求助
问题原因
- 最核心的原因是Gmail应用针对
ACTION_SENDTO类Intent不会返回RESULT_OK:大部分邮件应用发送完成后点击返回,返回的结果码都是RESULT_CANCELED,你代码里只判断结果码为RESULT_OK才执行删除,自然触发不到对应逻辑。 - 第二个可能的原因是
BackupRestoreActivity的启动模式配置错误:如果在AndroidManifest中给该Activity设置了singleInstance/singleTask启动模式,会导致启动的Gmail运行在独立的返回栈中,关闭Gmail后系统会直接回到上一个栈的MainActivity,不会回到BackupRestoreActivity,自然收不到结果回调。 - 第三个潜在问题是
file://格式的Uri在高版本系统的权限问题,虽然你当前在API28运行没有报错,但如果邮件应用没有读取你应用私有路径的权限,可能会导致流程异常,不过不属于本次问题的直接原因。
解决办法
- 首先修改Activity Result回调逻辑,删除结果码判断:不管用户是发送完成还是取消发送,临时文件都没有留存必要,只要回到你的应用就直接删除即可,修改后的代码如下:
startEmailActivity = registerForActivityResult(StartActivityForResult() ) { result :ActivityResult -> val file = File(mediaStorageDir, backupFileName) // 增加存在判断避免空删报错 if (file.exists()) { file.delete() } }
- 检查AndroidManifest.xml中
BackupRestoreActivity的配置,移除错误的launchMode设置:
<activity android:name=".BackupRestoreActivity" android:exported="false" <!-- 不要配置android:launchMode="singleInstance"或者android:launchMode="singleTask" --> />
- (可选适配优化)将
file://格式的Uri替换为FileProvider生成的content Uri,适配更高Android版本的权限规则,避免后续升级系统后出现附件加载失败的问题。
内容的提问来源于stack exchange,提问作者NY-Newboid
相关产品推荐
相关产品推荐

