You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 11:58:13