如何使用url_launcher仅打开默认邮件应用,而非进入撰写界面?
解决方案推荐
直接使用mailto:协议会默认打开邮件撰写界面,要实现直接启动邮件应用本身的需求,推荐以下几个Flutter包:
app_links:支持通过自定义URL Scheme或通用链接唤起指定应用,适配iOS和Android平台。你需要配置对应邮件应用的Scheme(比如iOS自带邮件应用用
message://,Android端Gmail用gmail://),再通过包的API唤起。示例代码:import 'package:app_links/app_links.dart'; final appLinks = AppLinks(); // 唤起Android端Gmail应用 await appLinks.openApp('com.google.android.gm'); // 唤起iOS自带邮件应用 await appLinks.openUrl(Uri.parse('message://'));url_launcher(进阶用法):原生的
url_launcher也能通过指定应用Scheme实现需求,只是需要自行查询目标平台邮件应用的Scheme。比如Android端Outlook的Scheme是ms-outlook://,iOS端是outlook://,直接调用launchUrl打开对应Uri即可:await launchUrl(Uri.parse('gmail://'), mode: LaunchMode.externalApplication);注意:不同邮件应用的Scheme存在差异,需要针对目标应用单独配置,同时要处理Scheme不存在的异常(比如用户未安装对应应用)。
device_apps:该包可列出设备上已安装的应用,筛选出邮件类应用后直接启动。示例代码:
import 'package:device_apps/device_apps.dart'; // 查找已安装的邮件应用 final apps = await DeviceApps.getInstalledApplications( includeSystemApps: true, onlyAppsWithLaunchIntent: true, ); final mailApp = apps.firstWhere((app) => app.appName.toLowerCase().contains('mail')); // 启动应用 await DeviceApps.openApp(mailApp.packageName);这个方法无需硬编码Scheme,能适配用户设备上任意已安装的邮件应用,但要处理找不到邮件应用的异常情况。
额外配置说明
- Android端:需在
AndroidManifest.xml中添加查询应用的权限:<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /> - iOS端:需在
Info.plist中添加对应应用的Scheme到LSApplicationQueriesSchemes数组,示例:<key>LSApplicationQueriesSchemes</key> <array> <string>message</string> <string>gmail</string> </array>
内容的提问来源于stack exchange,提问作者Frankline Sable
相关产品推荐
相关产品推荐

