问题
Steps to reproduce this error:
- Click update button & it opens update app dialog since it's
AppUpdateType.FLEXIBLE
. - Click
No, thanks
- Try update again. App crashes with following error:
I'm getting this exception while updating the app via inappupdate on following line.
appUpdateManager?.startUpdateFlowForResult(it, AppUpdateType.FLEXIBLE, activity, REQUEST_CODE_FLEXI_UPDATE) //it == AppUpdateInfo object
Stacktrace:
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:451)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:441)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)
Caused by: android.content.IntentSender$SendIntentException
at android.app.Activity.startIntentSenderForResultInner(Activity.java:4878)
at android.app.Activity.startIntentSenderForResult(Activity.java:4847)
at androidx.fragment.app.FragmentActivity.startIntentSenderForResult(FragmentActivity.java:796)
at android.app.Activity.startIntentSenderForResult(Activity.java:4814)
at androidx.fragment.app.FragmentActivity.startIntentSenderForResult(FragmentActivity.java:781)
at com.google.android.play.core.appupdate.b.startUpdateFlowForResult(Unknown Source:22)
at newProfile.NewProfileFragment.startForInAppUpdate(NewProfileFragment.kt:752)
at newProfile.NewProfileFragment.access$startForInAppUpdate(NewProfileFragment.kt:60)
at newProfile.NewProfileFragment$setupAppUpdate$3.onClick(NewProfileFragment.kt:682)
at android.view.View.performClick(View.java:6935)
at android.widget.TextView.performClick(TextView.java:12752)
at android.view.View$PerformClick.run(View.java:26214)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
Details:
Android version: 8.0
Phone: Samsung J7
Update
As per documentation,
startUpdateFlowForResult
should only called for onceAppUpdateInfo
instance. For calling again, you must createAppUpdateInfo
instance.
but since its instance depends on below condition, how to make sure its instance newly gets created before calling startUpdateFlowForResult
appUpdateManager?.appUpdateInfo?.addOnSuccessListener {
if (it.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE &&
it.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
appUpdateInfo = it
updateAvailable.value = true
} else {
updateAvailable.value = false
}
}
Also how to get progress value of app being downloaded, couldn't find it in documentation. In my case, onActivityResult keeps calling but which key gives progress value?
Also facing another issue with different use case: inappupdate not available after skipping installation
回答1:
The problem is that you are trying to trigger startUpdateFlowForResult
with the same AppUpdateInfo
twice.
As @Slaw suggested, after a failed or canceled update you need to do appUpdateManager.appUpdateInfo.addOnSuccessListener
again in order to have another instance of AppUpdateInfo
to make second call to startUpdateFlowForResult
来源:https://stackoverflow.com/questions/57290049/java-lang-reflect-invocationtargetexception-while-inappupdate-android-if-retries