Flutter调用launchUrl跳转邮件报ACTIVITY_NOT_FOUND异常求助
问题原因
该异常由三类常见问题触发:
mailto协议的Uri构造方式错误,特殊字符被自动转义后系统无法识别协议类型- Android 11及以上版本未配置包可见性权限,应用无法查询到设备内的邮件应用
- 跳转前未做可用性校验,测试设备无可用邮件应用时直接触发跳转崩溃
从报错日志里的mailto%3Asales@sookh.com可以确认,当前代码里的冒号被URL编码为%3A,系统无法识别这是邮件发送intent,是首要诱因。
分步解决方法
- 修正Uri构造逻辑
禁止使用Uri(path: "mailto:xxx")的写法,该方式会自动转义路径内的特殊字符导致协议失效,改用scheme参数显式指定邮件协议:// 错误写法(会转义特殊字符导致协议失效) // launchUrl(Uri(path: "mailto:${baseSetting.baseSetting?.mail ?? ''}")) // 正确写法 final emailUri = Uri( scheme: 'mailto', path: baseSetting.baseSetting?.mail ?? '', queryParameters: { // 可选:预填充邮件主题、正文 'subject': '产品咨询', 'body': '您好,' } ); - 增加跳转前可用性校验
调用launchUrl前必须先校验设备是否存在可处理该intent的应用,避免无对应应用时直接崩溃:if (await canLaunchUrl(emailUri)) { await launchUrl(emailUri); } else { // 兜底逻辑:弹出提示告知用户当前设备未安装可用邮件应用 } - 补全Android端配置
针对Android 11(API 30)及以上版本的包可见性限制,需要在android/app/src/main/AndroidManifest.xml文件中,<manifest>根节点下(与<application>标签平级)添加邮件协议的查询权限:<queries> <intent> <action android:name="android.intent.action.SENDTO" /> <data android:scheme="mailto" /> </intent> </queries> - 测试环境校验
部分安卓模拟器默认未预装任何邮件类应用,即使代码配置正确也会触发找不到Activity的报错,更换真机测试或在模拟器内安装邮件应用并完成账号配置后再验证即可。
内容的提问来源于stack exchange,提问作者Mamun Hossain
相关产品推荐
相关产品推荐

