Xamarin Android集成Google Pay报错:无Activity处理Intent求助
搞定Redmi Note 8更新后Google Pay UPI支付的ActivityNotFoundException问题
首先得说,你遇到的这个问题其实挺常见的——App更新或者系统升级后,原来好好的Intent调用突然失效了,核心原因就是硬编码包名+老旧的Intent构造方式,碰上了Google Pay或者MIUI的变更。咱们一步步来解决:
问题根因拆解
从你贴的异常栈来看,系统找不到能处理你指定的那个Intent的Activity,而且你明确指定了Google Pay的包名com.google.android.apps.nbu.paisa.user。大概率是这两个原因:
- Google Pay更新后,内部处理UPI支付的Activity的Intent过滤规则变了,你原来的
ACTION_VIEW+包名的方式匹配不到了; - Redmi的MIUI系统更新后,加了应用跳转的限制,你的App没法调用Google Pay的支付页面;
具体解决方案
1. 放弃硬编码包名,用Intent Chooser(最推荐)
你代码里其实已经注释了Chooser的部分,这才是兼容所有UPI应用的正确姿势!硬编码包名太脆弱了,Google随便改个内部组件,你的代码就炸了。
修改后的代码是这样的:
private static int TEZ_REQUEST_CODE = 123; try { if (wallet.WalletAmount > 0) { RefrenceID = AndroidHelper.GetReferenceID(); Android.Net.Uri uri = new Android.Net.Uri.Builder() .Scheme("upi") .Authority("pay") .AppendQueryParameter("pa", "xxxxxxx@okhdfcbank") .AppendQueryParameter("pn", "XYZStore") .AppendQueryParameter("tn", RefrenceID) .AppendQueryParameter("am", WalletAmount) .AppendQueryParameter("cu", "INR") .Build(); Intent upiPayIntent = new Intent(Intent.ActionView); upiPayIntent.SetData(uri); // 加上默认类别,提升Intent的匹配成功率 upiPayIntent.AddCategory(Intent.CategoryDefault); Intent chooser = Intent.CreateChooser(upiPayIntent, "选择UPI支付应用"); if (chooser.ResolveActivity(this.PackageManager) != null) { StartActivityForResult(chooser, TEZ_REQUEST_CODE); } else { Toast.MakeText(this, "未找到支持UPI的支付应用,请安装后重试", ToastLength.Long).Show(); } } } catch (Android.Content.ActivityNotFoundException ex) { Toast.MakeText(this, "未找到Google Pay应用,请安装后重试", ToastLength.Long).Show(); } catch (Exception ex) { Toast.MakeText(this, "发生异常 - E1002", ToastLength.Long).Show(); }
这么做的好处:
- 不仅支持Google Pay,还兼容PhonePe、Paytm等所有UPI应用,用户体验更好;
- 完全避开了单一App更新带来的兼容性问题;
2. 如果一定要只支持Google Pay,用官方推荐的Intent
如果你业务上必须指定Google Pay,别再用ACTION_VIEW了,改用Google官方推荐的Intent构造方式:
Intent intent = new Intent("com.google.android.gms.wallet.action.PAY"); intent.SetPackage("com.google.android.apps.nbu.paisa.user"); intent.PutExtra("com.google.android.gms.wallet.EXTRA_UPI_TRANSACTION_URI", uri.ToString()); // 先检查有没有能处理的Activity,再启动 if (intent.ResolveActivity(this.PackageManager) != null) { StartActivityForResult(intent, TEZ_REQUEST_CODE); } else { Toast.MakeText(this, "Google Pay版本过低或不支持此支付方式,请更新应用", ToastLength.Long).Show(); }
不过这种方式还是依赖Google的内部Action,不如Chooser通用,还是优先选第一种方案。
3. 检查Redmi设备的MIUI权限设置
MIUI经常会加一些隐私限制,可能阻止你的App调用其他应用:
- 打开手机「设置」→「应用设置」→「权限管理」→找到你的App,开启「调用其他应用」权限;
- 检查Google Pay的权限,确保它允许被其他App调用;
- 去「安全中心」看看有没有开启「应用拦截」之类的功能,暂时关掉试试;
4. 确保Google Pay是最新版本
让用户把Google Pay更到最新版,有时候旧版本的Google Pay在系统更新后会出现兼容性问题,更新后大概率能解决。
最后提个小建议
以后做支付相关的功能,尽量不要绑定单一应用,给用户选择权的同时,也能减少你这边的兼容性维护成本。另外,每次调用Intent前一定要用ResolveActivity检查,避免抛出不必要的异常。
内容的提问来源于stack exchange,提问作者Zala Krunal
相关产品推荐
相关产品推荐

