Android 14中Stripe Payment Sheet崩溃问题求助
我用Java开发的Android应用集成了Stripe支付模块,通过Stripe Android SDK的Payment Sheet实现付费流程。在Android 14测试设备上,输入银行卡信息后点击支付按钮应用崩溃,其他Android版本运行正常,推测是Android 14测试版的问题。
崩溃时的错误日志如下:
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.bigstride.jobportal_company, PID: 9012 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bigstride.jobportal_company/com.stripe.android.payments.StripeBrowserLauncherActivity}: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.CHOOSER (has extras) } at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3782) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3922) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:139) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:205) at android.os.Looper.loop(Looper.java:294) at android.app.ActivityThread.main(ActivityThread.java:8176) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971) Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.CHOOSER (has extras) } at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2239) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1878) at android.app.Activity.startActivityForResult(Activity.java:5589) at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:728) at androidx.core.app.ActivityCompat$Api16Impl.startActivityForResult(ActivityCompat.java:809) at androidx.core.app.ActivityCompat.startActivityForResult(ActivityCompat.java:246) at androidx.activity.ComponentActivity$2.onLaunch(ComponentActivity.java:243) at androidx.activity.result.ActivityResultRegistry$2.launch(ActivityResultRegistry.java:175) at androidx.activity.result.ActivityResultLauncher.launch(ActivityResultLauncher.java:47) at com.stripe.android.payments.StripeBrowserLauncherActivity.onCreate(StripeBrowserLauncherActivity.kt:56) at android.app.Activity.performCreate(Activity.java:8595) at android.app.Activity.performCreate(Activity.java:8573) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1456) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3764) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3922) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:139) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:205) at android.os.Looper.loop(Looper.java:294) at android.app.ActivityThread.main(ActivityThread.java:8176) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
正常流程是点击支付按钮后跳转到Stripe的链接处理支付,但Android 14里直接崩溃,推测是无法打开浏览器导致的。实现参考了Stripe官方文档,预期是打开浏览器完成支付,实际崩溃终止流程,求解决方案。
针对Android 14上出现的ActivityNotFoundException问题,可尝试以下几种解决方式:
升级Stripe Android SDK到最新版本
Stripe会针对Android新版本的兼容性问题发布修复更新,检查并升级到最新版SDK,大概率能解决这类系统适配问题。显式指定浏览器打开链接
在启动浏览器Intent时,显式设置包名指定系统浏览器,避免Android 14上的Chooser Intent无法匹配到可用Activity:// 创建打开Stripe链接的Intent Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(stripeUrl)); // 指定系统浏览器包名,比如Chrome的包名是com.android.chrome browserIntent.setPackage("com.android.chrome"); // 启动前检查是否有可用Activity if (browserIntent.resolveActivity(getPackageManager()) != null) { startActivity(browserIntent); } else { // 若Chrome不存在,尝试唤起其他浏览器 browserIntent.setPackage(null); startActivity(Intent.createChooser(browserIntent, "选择浏览器")); }注意:如果使用Stripe SDK的默认跳转逻辑,可能需要自定义
StripeBrowserLauncherActivity或者拦截Intent处理逻辑。检查Android 14的权限和Intent过滤规则
Android 14对Intent的处理有更严格的限制,确保你的应用声明了必要的权限,并且Stripe相关的Activity配置正确。在AndroidManifest.xml中确认StripeBrowserLauncherActivity的注册:<activity android:name="com.stripe.android.payments.StripeBrowserLauncherActivity" android:exported="true" />另外,确保应用有
android.permission.INTERNET权限。测试Android 14正式版或更新测试版
如果是Android 14早期测试版的系统bug,升级到最新的测试版或正式版后问题可能自动消失。
内容的提问来源于stack exchange,提问作者Devarsh Ukani

