I implemented In-App Update on Android.
Todya I published a new version of my App and I'm having a lot of errors in Play Console (+3K errors for this cause today!).
The error is:
java.lang.IllegalArgumentException: at androidx.fragment.app.FragmentActivity.checkForValidRequestCode (FragmentActivity.java:715) at androidx.fragment.app.FragmentActivity.startIntentSenderForResult (FragmentActivity.java:702) at com.google.android.play.core.appupdate.d.startIntentSenderForResult (Unknown Source:9) at com.google.android.play.core.appupdate.b.startUpdateFlowForResult (Unknown Source:35) at com.google.android.play.core.appupdate.b.startUpdateFlowForResult (Unknown Source:5) at org.deiverbum.app.activities.MainActivity.lambda$checkAppUpdate$1$MainActivity (MainActivity.java:258) at org.deiverbum.app.activities.-$$Lambda$MainActivity$yZ2n4QRhF7BFdFURB2K2ok-2vu8.onSuccess (Unknown Source:4) at com.google.android.play.core.tasks.e.run (Unknown Source:27) at android.os.Handler.handleCallback (Handler.java:809) at android.os.Handler.dispatchMessage (Handler.java:102) at android.os.Looper.loop (Looper.java:166) at android.app.ActivityThread.main (ActivityThread.java:7555) at java.lang.reflect.Method.invoke (Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:469) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:963)
The crash occurs in the line 258: appUpdateManager.startUpdateFlowForResult(
This is my code for update into MainActivity
:
private void checkAppUpdate() {
appUpdateManager = AppUpdateManagerFactory.create(this);
appUpdateManager.registerListener(installStateUpdatedListener);
Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();
appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
&& appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
try {
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
AppUpdateType.FLEXIBLE,
this,
UPDATE_REQUEST_CODE);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
}
});
}
This method is called from onCreate()
:
protected void onCreate(Bundle savedInstanceState) {
//...
checkAppUpdate();
}
I have these fields on MainActivty
:
private static final int UPDATE_REQUEST_CODE = 20200100;
private AppUpdateManager appUpdateManager;
private InstallStateUpdatedListener installStateUpdatedListener = installState -> {
if (installState.installStatus() == InstallStatus.DOWNLOADED) {
popupAlerter();
}
};
I also have this code related to In-App update on MainActivity
:
@Override
protected void onDestroy() {
unregisterListener();
super.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
checkNewAppVersionState();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == UPDATE_REQUEST_CODE) {
if (resultCode != RESULT_OK) {
Log.d(TAG, "Update flow failed! Result code: " + resultCode);
}
}
}
/*
You should execute this check at all app entry points.
*/
private void checkNewAppVersionState() {
appUpdateManager
.getAppUpdateInfo()
.addOnSuccessListener(new OnSuccessListener<AppUpdateInfo>() {
@Override
public void onSuccess(AppUpdateInfo appUpdateInfo) {
if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED) {
popupAlerter();
Log.d(TAG, "checkNewAppVersionState(): resuming flexible update. Code: " + appUpdateInfo.updateAvailability());
}
}
});
}
private void popupAlerter() {
Snackbar snackbar =
Snackbar.make(
findViewById(android.R.id.content),
"Nueva versión descargada, por favor reinicia",
Snackbar.LENGTH_INDEFINITE);
snackbar.setAction("REINICIAR", view -> appUpdateManager.completeUpdate());
snackbar.setActionTextColor(
getResources().getColor(R.color.colorAccent));
snackbar.show();
}
private void unregisterListener() {
if (appUpdateManager != null && installStateUpdatedListener != null)
appUpdateManager.unregisterListener(installStateUpdatedListener);
}
I write this code reading the explanations on Android and another tutorial, but I don't know what's causing these errors.