升级targetSdkVersion34后Razorpay结账遇SecurityException崩溃
问题描述
将targetSdkVersion和compileSdkVersion设置为34后,在Android 14(API代号"VanillaIceCream")设备上尝试结账时,应用出现崩溃,崩溃日志如下:
FATAL EXCEPTION: main (Ask Gemini) Process: com.razorpay.newsampleapp, PID: 3019 java.lang.SecurityException: com.razorpay.newsampleapp: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specifi at android.os.Parcel.createExceptionOrNull(Parcel.java:3242) at android.os.Parcel.createException(Parcel.java:3226) at android.os.Parcel.readException(Parcel.java:3209) at android.os.Parcel.readException(Parcel.java:3151) at android.app.IActivityManager$Stub$Proxy.registerReceiverWithFeature(IActivityManager.java:6064) at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1880) at android.app.ContextImpl.registerReceiver(ContextImpl.java:1820) at android.app.ContextImpl.registerReceiver(ContextImpl.java:1808) at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:757) at com.razorpay.CheckoutPresenterImpl.startSmsRetrieverForSavedCardsOTP(CheckoutPresenterImpl.java:887) at com.razorpay.CheckoutPresenterImpl.access$600(CheckoutPresenterImpl.java:59) at com.razorpay.G$_X_.onFinish(CheckoutPresenterImpl.java:866) at android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:142) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loopOnce(Looper.java:232) at android.os.Looper.loop(Looper.java:317) at android.app.ActivityThread.main(ActivityThread.java:8674) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:886)
环境信息
- Razorpay SDK版本:
com.razorpay:checkout:1.6.20 - Android系统版本:Android 14
操作步骤
- 将项目的targetSdkVersion和compileSdkVersion更新至34
问题现象
尝试进入结账流程时,Razorpay结账页面打开1-2秒后应用崩溃,返回结账错误。
重现步骤
- 在
build.gradle(app)文件中设置targetSdkVersion为34 - 在Android 14设备上运行应用
- 启动结账流程:Razorpay结账页面加载后很快崩溃,出现错误
建议解决方案
根据Android 13及以上版本的安全要求,注册广播接收器时必须指定RECEIVER_EXPORTED或RECEIVER_NOT_EXPORTED属性(除非仅接收系统广播)。我在自己应用的其他广播接收器中遇到过相同问题,通过在registerReceiver()方法中传入Context.RECEIVER_NOT_EXPORTED参数解决了问题,推测Razorpay SDK也需要做类似修复。
示例代码如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { registerReceiver(broadcastReceiver, new IntentFilter(AppConstants.MA_VIDEO_RECEIVER), Context.RECEIVER_NOT_EXPORTED); } else { registerReceiver(broadcastReceiver, new IntentFilter(AppConstants.MA_VIDEO_RECEIVER)); }
为排除自身应用问题,我测试了Razorpay官方示例应用,将其targetSdkVersion和compileSdkVersion改为34后,同样出现了该崩溃问题。目前已在Razorpay的GitHub仓库提交问题,但尚未得到解决方案。
内容的提问来源于stack exchange,提问作者Sagar Bharatbhai Chauhan
相关产品推荐
相关产品推荐

