Flutter Android端如何强制在系统浏览器打开SBP支付链接并忽略DeepLink
解决方案:强制Android系统在浏览器打开SBP支付链接
针对你的场景,要避免第三方银行App通过DeepLink拦截SBP支付链接,确保链接在系统浏览器中打开,可以通过以下两种方式实现(基于Flutter的launchUrl API):
方法1:通过Flutter launchUrl的浏览器专属配置
直接在调用launchUrl时,指定浏览器启动模式为外部应用打开,并配置Intent标记限制仅浏览器处理:
import 'package:url_launcher/url_launcher.dart'; Future<void> launchSbpUrl(String url) async { final Uri uri = Uri.parse(url); if (await canLaunchUrl(uri)) { await launchUrl( uri, mode: LaunchMode.externalApplication, browserLaunchMode: BrowserLaunchMode.externalApplication, // 添加Intent标记,确保链接仅由浏览器处理 webOnlyIntent: const Intent( action: Intent.actionView, categories: {Intent.categoryBrowsable}, ), ); } }
关键参数说明:
mode: LaunchMode.externalApplication:强制启动外部应用,而非在当前App内的WebView打开。browserLaunchMode: BrowserLaunchMode.externalApplication:明确要求使用系统默认浏览器打开链接,而非其他支持DeepLink的应用。webOnlyIntent:针对Web链接添加Intent.categoryBrowsable,该类别仅浏览器应用会声明,能过滤掉银行App的DeepLink拦截。
方法2:指定系统浏览器包名(更彻底)
如果方法1仍有被拦截的情况,可以直接指定系统浏览器的包名,强制链接在指定浏览器中打开。以下是常见厂商的系统浏览器包名:
- 谷歌Chrome:
com.android.chrome - 三星浏览器:
com.sec.android.app.sbrowser - 小米浏览器:
com.android.browser - 华为浏览器:
com.huawei.browser
实现代码如下:
import 'package:url_launcher/url_launcher.dart'; Future<void> launchSbpUrlInSystemBrowser(String url) async { final Uri uri = Uri.parse(url); // 优先尝试Chrome,若不存在则 fallback 到其他浏览器 List<String> browserPackages = [ "com.android.chrome", "com.sec.android.app.sbrowser", "com.android.browser" ]; for (String package in browserPackages) { if (await canLaunchUrl(uri, mode: LaunchMode.externalApplication, webOnlyPackageName: package)) { await launchUrl( uri, mode: LaunchMode.externalApplication, webOnlyPackageName: package, ); return; } } // 若指定浏览器都不存在,使用默认浏览器打开 await launchUrl( uri, mode: LaunchMode.externalApplication, browserLaunchMode: BrowserLaunchMode.externalApplication, ); }
注意事项:
- 针对Android 11及以上系统,若要检测浏览器是否存在,需在
AndroidManifest.xml中添加权限或查询声明:- 方式1:添加全量查询权限
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /> - 方式2(更合规):声明允许查询的浏览器包名
<queries> <package android:name="com.android.chrome" /> <package android:name="com.sec.android.app.sbrowser" /> <package android:name="com.android.browser" /> </queries>
- 方式1:添加全量查询权限
验证方式
测试时可先卸载所有支持SBP DeepLink的银行App,确认链接能正常打开浏览器;再安装银行App,测试是否不会被拦截,而是直接进入浏览器。
内容的提问来源于stack exchange,提问作者gregman
相关产品推荐
相关产品推荐

