Я реализовал In-App Update на Android.
Сегодня я опубликовал новую версию своего приложения, и у меня много ошибок в Play Console (+ 3K ошибок по этой причине сегодня! ).
Ошибка:
java .lang.IllegalArgumentException: на androidx.fragment.app.FragmentActivity.checkForValidRequestCode (FragmentActivity. java: 715) на androidx .fragment.app.FragmentActivity.startIntentSenderForResult (FragmentActivity. java: 702) на com.google. android .play.core.appupdate.d.startIntentSenderForResult (неизвестный источник: 9) на com.google. android. play.core.appupdate.b.startUpdateFlowForResult (неизвестный источник: 35) на странице com.google. android .play.core.appupdate.b.startUpdateFlowForResult (неизвестный источник: 5) на странице org.deiverbum.app.activities.MainActivity. lambda $ checkAppUpdate $ 1 $ MainActivity (MainActivity. java: 258) на сайте org.deiverbum.app.activities .- $$ Lambda $ MainActivity $ yZ2n4QRhF7BFdFURB2K2ok-2vu8.onSuccess (неизвестный источник: 4) 1039 на сайте com.google. .play.core.tasks.e.run (Неизвестный Соу rce: 27) в android .os.Handler.handleCallback (обработчик. java: 809) в android .os.Handler.dispatchMessage (обработчик. java: 102) в android .os.Looper .l * * тысяча сорок пять (Лупер * * тысяча сорок-шести:. 166) при * * .app.ActivityThread.main тысячи сорок семь (ActivityThread java:. 7555) при * * .lang.reflect.Method.invoke тысячи сорок-девять (Родной метод) при com. android .internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit. java: 469) на com. android .internal.os.ZygoteInit.main (ZygoteInit. java: 963)
cra sh происходит в строке 258: appUpdateManager.startUpdateFlowForResult(
Это мой код для обновления 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();
}
}
});
}
Этот метод называется от onCreate()
:
protected void onCreate(Bundle savedInstanceState) {
//...
checkAppUpdate();
}
У меня есть эти поля на MainActivty
:
private static final int UPDATE_REQUEST_CODE = 20200100;
private AppUpdateManager appUpdateManager;
private InstallStateUpdatedListener installStateUpdatedListener = installState -> {
if (installState.installStatus() == InstallStatus.DOWNLOADED) {
popupAlerter();
}
};
У меня также есть этот код, связанный с обновлением в приложении на 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);
}
Я пишу этот код, читая пояснения к Android и другой учебник, но я не знаю, что вызывает эти ошибки.