1

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.

A. Cedano
  • 557
  • 7
  • 39
  • Have you had any luck finding what was wrong? I'm having the same issue. – Martynas Jurkus Apr 30 '20 at 10:57
  • @MartynasJurkus No. I still don't understand why those errors occur. However, the updates seem to be being done, because within a few days of launching the new version it had about 90% of users who had updated. – A. Cedano Apr 30 '20 at 17:11
  • The same issue on my google play console, any solution except try/catch? – nAkhmedov Oct 18 '21 at 08:01

0 Answers0