Android API 30中intent.resolveActivity返回null UPI支付无法唤起已安装应用
问题根源
AndroidManifest.xml中queries标签配置错误:你实际发起支付用的Intent action是ACTION_VIEW,但你配置的查询action是android.intent.action.CHOOSER,和实际唤起UPI应用的Intent不匹配,Android 11及以上的包可见性机制会过滤掉所有UPI应用,导致查询结果为空。- 代码逻辑存在两处可优化点:一是原代码调用
setData时直接传入String类型的url,未转换为Uri类型,会存在类型错误;二是用原始Intent调用resolveActivity的判断方式在高版本系统上可靠性低于先查询所有支持的应用列表。
修复步骤
- 修改
AndroidManifest.xml中的queries配置:
<queries> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="upi" /> </intent> </queries>
- 调整支付唤起逻辑:
String url = "upi://pay?pa=fcbizpayg@freecharge&pn=PAYG&mc=7299&tid=AXIFRCO1506202118501b5bu4s903cafgu4&tr=AXIFRCO1506202118501b5bu4s903cafgu4&am=50.00&cu=INR"; Intent intent = new Intent(Intent.ACTION_VIEW); // 修正:将String类型的url转换为Uri类型 intent.setData(Uri.parse(url)); // 先查询系统中所有可处理UPI支付Intent的应用 List<ResolveInfo> upiApps = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); if (!upiApps.isEmpty()) { Intent appChooser = Intent.createChooser(intent, "Pay using"); startActivityForResult(appChooser, PAYMENT_REQUEST); } else { Toast.makeText(PaymeroUserDetailsActivity.this, "No UPI app found! Please Install to Proceed!", Toast.LENGTH_LONG).show(); }
补充说明
如果你的应用targetSdkVersion >=30,上述配置即可生效;如果是更低版本,不需要配置queries标签,调整代码逻辑即可正常运行。
内容的提问来源于stack exchange,提问作者Amit Yadav
相关产品推荐
相关产品推荐

