使用应用内更新时出现java.lang.reflect.InvocationTargetException问题

16

我使用了Google Play Core库,通过这个链接集成了应用内更新功能。

我使用立即更新选项,因为我们经常进行各种重要的关键错误修复,需要及时更新。

以下是应用程序成功更新和崩溃的情况:

  1. 当应用程序有可用更新时,点击“更新”按钮,并让更新完整地完成而不中途中断-应用程序成功更新。
  2. 点击“更新”按钮,更新开始下载,但用户在“更新下载进度条”后面按下“x”按钮中途取消更新-应用程序更新被取消。
  3. 尝试再次打开应用程序,它会崩溃并显示以下错误。
致命异常:java.lang.RuntimeException java.lang.reflect.InvocationTargetException com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:586) com.android.internal.os.ZygoteInit.main (ZygoteInit.java:942) 由于java.lang.reflect.InvocationTargetException引起的 java.lang.reflect.Method.invoke (Method.java) com.android.internal.os.ZygoteInit.main (ZygoteInit.java:942) 由android.content.IntentSender$SendIntentException引起的 android.app.Activity.startIntentSenderForResultInner (Activity.java:5019) com.google.android.play.core.appupdate.b.startUpdateFlowForResult (Unknown Source:5) co.behtarinternal.app.menu.MenuActivity$checkForAppUpdate$1.onSuccess (MenuActivity.kt:239) co.behtarinternal.app.menu.MenuActivity$checkForAppUpdate$1.onSuccess (MenuActivity.kt:43) com.google.android.play.core.tasks.e.run (Unknown Source:27) com.android.internal.os.ZygoteInit.main (ZygoteInit.java:942)
我也参考了这个问题及其答案, 但是不知道如何实现该解决方案。
我已经到处搜索了很多,但没有找到与此问题相关的可行解决方案。
如果你们中有人遇到类似的问题,并且你的解决方案有效,请帮助我。

你能找到解决这个问题的方法吗? - rpattabi
到目前为止还没有解决。你有什么想法吗? - Divya Gupta
还没有。:-( 我最近看到了一个这个错误的崩溃报告。很可能是Play Core的一个bug。如果我找到了什么,我会在这里通知你。 - rpattabi
当然。请告诉我。 - Divya Gupta
我应该向Play Core论坛报告此错误。 - Divya Gupta
这是我自己的一个愚蠢问题,但您是否保留appUpdateManager的引用并以任何方式重复使用?似乎appUpdateManager实例是通过工厂方法调用创建的,并提供对appUpdateInfo的引用。因此,如果重新使用它,则可能会使您获取到同一旧版本的appUpdateInfo实例的引用。 - Harshvardhan Joshi
1个回答

7
据我所了解,您正在尝试在多个位置使用同一个 AppUpdateInfo 实例中的 PendingIntent。 由于 PendingIntent 只能使用一次,因此会引发异常。为了解决这个问题,我猜您有一个选项。
如果可以在本地复现此错误,请在 try-catch 方法中调用 startUpdateFlowForResult() 并尝试捕获 IntentSender$SendIntentExceptionInvocationTargetException 异常。如果捕获到异常,则表示 PendingIntent 已经被使用。假设您的 checkUpdates() 方法可以递归使用,请再次调用 checkUpdates(),这将创建一个新的 AppUpdateManager 实例并重新启动生命周期,从而导致产生新的 AppUpdateInfo 作为结果,因此是可以打开应用程序更新弹出窗口的新的 PendingIntent
编辑:我不确定当 onResume 代码再次执行时会发生什么?就像在调用 checkForUpdates 的同时,你还通过调用 AppUpdateManager.getInstance(this) 来替换 onResume 中的 mAppUpdateManager。 因此,可能会出现 mAppUpdateManager.appUpdateInfo 不属于 onResume 中新分配的 mAppUpdateManager 的情况,因为在应用程序启动时将调用 onCreateonResume。因此,对象本身可能不属于 AppUpdateManager 本身。
解决方案可能是使用两个不同的管理器,但我认为机制本身会返回一个单例,这使得它们两者相同(也许?)无论如何,在调试模式下需要检查地址端点。调试对象应该看起来像 AppUpdateManager@2b62aa,请检查管理器是否不同。如果它们变得不同,那么您的问题应该得到解决。

2
问题在于,这个 bug 并不经常出现,也不会在测试时出现,只有当我将更新发布并且用户尝试通过应用内更新下载时才会出现。而且,在这种情况下,每个不同的用户进行更新时都会出现这个 bug。因此,它只能通过 Crashlytics 日志查看,而不能在本地查看。 - Divya Gupta
如果可能的话,你能分享一下这个过程的源代码吗?我无法仅凭猜测来推断出问题所在。也许如果我看到代码,我可以给出更好的答案。 - Furkan Yurdakul
这里是要点 https://gist.github.com/Divya0319/dd5a2a47d92106a6ac1bedd7d7840482 - Divya Gupta
当调用checkUpdates两次时,应用程序更新管理器是相同的。现在该怎么办? - Rahul
你是否尝试过每次创建一个新的应用程序更新管理器来解决这个问题? - Filippo Vigani
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接