【Unity】崩溃JNI CallVoidMethodV called with pending exception java.lang.SecurityException: listen

文章描述了在mumu模拟器Android12版本中使用Unity时遇到的问题,即调用Google登录后应用崩溃,原因在于TelephonyManager.listen方法已过期。解决方法包括升级Unity引擎至2021.3.12f1,修改classes.jar,设置PlayerSettings.muteOtherAudioSources为true以避免音乐冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:mumu模拟器12 (Android12版)调起Google登录窗口,输入账密或直接选账户后,窗口正常关闭,紧接着应用崩溃(闪退)查日志得出如下报错。

 JNI DETECTED ERROR IN APPLICATION: JNI CallVoidMethodV called with pending exception java.lang.SecurityException: listen
   at java.lang.Exception android.os.Parcel.createExceptionOrNull(int, java.lang.String) (Parcel.java:2425)
   at java.lang.Exception android.os.Parcel.createException(int, java.lang.String) (Parcel.java:2409)
   at void android.os.Parcel.readException(int, java.lang.String) (Parcel.java:2392)
   at void android.os.Parcel.readException() (Parcel.java:2334)
   at void com.android.internal.telephony.ITelephonyRegistry$Stub$Proxy.listenWithEventList(int, java.lang.String, java.lang.String, com.android.internal.telephony.IPhoneStateListener, int[], boolean) (ITelephonyRegistry.java:1036)
   at void android.telephony.TelephonyRegistryManager.listenFromListener(int, java.lang.String, java.lang.String, android.telephony.PhoneStateListener, int, boolean) (TelephonyRegistryManager.java:250)
   at void android.telephony.TelephonyManager.listen(android.telephony.PhoneStateListener, int) (TelephonyManager.java:6028)
   at void com.unity3d.player.UnityPlayer.addPhoneCallListener() ((null):-1)
   at boolean com.unity3d.player.UnityPlayer.nativeRender() ((null):-2)
   at boolean com.unity3d.player.UnityPlayer.access$300(com.unity3d.player.UnityPlayer) ((null):-1)
   at boolean com.unity3d.player.UnityPlayer$e$1.handleMessage(android.os.Message) ((null):-1)
   at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:102)
   at boolean android.os.Looper.loopOnce(android.os.Looper, long, int) (Looper.java:201)
   at void android.os.Looper.loop() (Looper.java:288)
   at void com.unity3d.player.UnityPlayer$e.run() ((null):-1)
 Caused by: android.os.RemoteException: Remote stack trace:
     at com.android.internal.telephony.TelephonyPermissions.enforceCarrierPrivilege(TelephonyPermissions.java:645)
     at com.android.internal.telephony.TelephonyPermissions.checkReadPhoneState(TelephonyPermissions.java:149)
     at com.android.internal.telephony.TelephonyPermissions.checkCallingOrSelfReadPhoneState(TelephonyPermissions.java:94)
     at com.android.server.TelephonyRegistry.checkListenerPermission(TelephonyRegistry.java:3131)
     at com.android.server.TelephonyRegistry.listen(TelephonyRegistry.java:1025)
 
 (Throwable with no stack trace)
 
     in call to CallVoidMethodV
     from boolean com.unity3d.player.UnityPlayer.nativeRender()

TelephonyManager.listen 在Andorid12 已过期,因此导致一系列错误而崩溃。

解决方案:
升级Unity引擎(如:2021.3.12f1)

修改classes.jar文件,屏蔽已过期代码
Unity2018,Android平台 Target API level 升级到 31以上,在Android 12上启动黑屏卡死【完美解决办法】_unity2018 android api 30-优快云博客

PlayerSettings.muteOtherAudioSources=true; (同理设置PlayerSetting - Mute Other Audio Sources勾选),默认为false,为true会导致游戏后台无法播放音乐,只允许有游戏音乐。(个人采取此方案,因为在谷歌正式发布后这个崩溃问题会莫名消失)

参考:Android 12 Telephony Crash - Unity Forum

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值