如何在Flutter中启动带数据和包名的Android Intent?
如何将ADB启动Intent命令转换为Flutter实现?
我有一条可通过Android Debug Bridge(ADB)正常运行的命令:
adb shell am start -W -a android.intent.action.VIEW -d "https://www.paytr.com/payment?paymentSessionToken=$token" com.provisionpay.softpos.paytr
需要将其转换为Flutter实现。
已尝试方案
1. 使用url_launcher
final uri = Uri.parse('https://www.paytr.com/payment?paymentSessionToken=asdasdasd'); launchUrl(uri, mode: LaunchMode.externalApplication);
此代码会在浏览器中打开www.paytr.com,无法唤起目标应用。
2. 使用external_app_launcher
await LaunchApp.openApp( androidPackageName: 'com.provisionpay.softpos.paytr', openStore: false );
即使应用已安装,此代码仍会跳转到Google Play商店,且无法传递支付链接参数。
正确实现方式:使用android_intent_plus包
这个包可以直接构造与ADB命令完全匹配的Android Intent,精准唤起目标应用并传递参数。
步骤1:添加依赖
在pubspec.yaml中添加依赖:
dependencies: android_intent_plus: ^4.0.0 # 建议使用最新版本
步骤2:编写实现代码
import 'package:android_intent_plus/android_intent_plus.dart'; void launchPayTrPayment(String token) async { final payTrIntent = AndroidIntent( action: 'android.intent.action.VIEW', // 对应ADB中的`-a`参数 data: 'https://www.paytr.com/payment?paymentSessionToken=$token', // 对应ADB中的`-d`参数 package: 'com.provisionpay.softpos.paytr', // 对应ADB末尾指定的包名 ); await payTrIntent.launch(); }
为什么之前的方案无效?
url_launcher:仅发起VIEW动作打开URI,但未指定目标应用包名,系统会默认用浏览器处理,而非目标应用。external_app_launcher:仅单纯启动应用,未传递VIEW动作和支付链接参数,且可能因包名校验或配置问题跳转至应用商店。
内容的提问来源于stack exchange,提问作者M. Akar
相关产品推荐
相关产品推荐

