AppUpdateManager.startUpdateFlowForResult не показывает диалог

Я пытаюсь реализовать обновления Android в приложении. Я следую инструкциям на официальном портале, но диалоговое окно не отображается при вызове метода startUpdateflow. Пожалуйста, найдите ниже фрагмент кода, который я выполняю.

final AppUpdateManager appUpdateManager = AppUpdateManagerFactory.create(this);
    Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();
    appUpdateInfoTask.addOnSuccessListener(new OnSuccessListener<AppUpdateInfo>() {
        @Override
        public void onSuccess(AppUpdateInfo appUpdateInfo) {
            try {
                Toast.makeText(getApplicationContext(),"Success.", Toast.LENGTH_SHORT).show();
                appUpdateManager.startUpdateFlowForResult(
                        appUpdateInfo,
                        AppUpdateType.FLEXIBLE,
                        SplashScreenActivity.this,
                        APP_UPDATE_REQUEST_CODE
                );
            } catch (IntentSender.SendIntentException e) {
                Toast.makeText(getApplicationContext(),"Exception received", Toast.LENGTH_SHORT).show();
                e.printStackTrace();
            }
        }
    });

Я могу видеть успех тост и линию

appUpdateManager.startUpdateFlowForResult() is called

но это не показывает диалог обновления с кнопками No Thanks и Update, как показано на портале. Я тоже пытался использовать FakeAppUpdateManager, но это тоже не помогло.

Обращаться за помощью здесь!

4 ответа

Вот что я заметил; другими словами, ваш пробег может отличаться.

Обновление в приложении работает так, как рекламируется, но для того, чтобы оно работало так, как вы ожидаете, необходимо выполнить несколько вещей.

  1. Вам необходимо установить тестовое приложение из Google Play; он не будет работать, если вы просто установите его из Android Studio.

  2. Установить его из Google Play можно через «Открытое тестирование», «Закрытое тестирование» или «Внутреннее тестирование», но (я думаю) эти треки допускают только выпускные сборки (т.е. не могут устанавливать точки останова), поэтому я предлагаю вам начать с «Внутренним совместным доступом к приложению». Просто загрузите свой или на https://play.google.com/console/internal-app-sharing . Единственное, что, похоже, не работает, - это установка приоритета обновления во «Внутренний совместный доступ к приложению». Я хотел бы услышать, как другие справятся с этим.

  3. FakeAppUpdateManagerНЕ показывает диалог обновления. Вы просто издеваетесь над тем, что будет делать Google Play, вводя такие команды, как fakeAppUpdateManager.downloadStarts(), но диалоговых окон не будет. Обратитесь к этому .

  4. Обновление может быть как FLEXIBLE а также IMMEDIATEв то же время. Другими словами, если вы проверите appUpdateInfo.isUpdateTypeAllowed(FLEXIBLE) а также appUpdateInfo.isUpdateTypeAllowed(IMMEDIATE), они могут быть обоими true. Вам решать, что делать в этот момент, в зависимости от приоритета обновления.

Вот шаги, которые я предпринял.

  1. Установите значение 2, создайте либо .apk или же .aab(в отладочной версии) и загрузите его во «Внутренний доступ к приложению». Запишите его URL-адрес загрузки.

  2. Набор versionCode на 1 и проделайте то же, что и в шаге 1.

  3. Откройте URL-адрес из шага 2 (т.е. версии 1) с телефона. Он откроет Google Play и попросит вас загрузить приложение. Загрузите и откройте его.

  4. Откройте URL-адрес из шага 1 (т.е. версии 2) с телефона, но НЕ нажимайте кнопку «Обновить»; просто выведите на передний план версию приложения 1.

  5. Пока приложение работает, подключите отладчик (Android Studio -> Run -> Attach Debugger to Android Process).

  6. Проверить обновление ( appUpdateManager.appUpdateInfo.addOnSuccessListener {...}) запускаем обновление ( appUpdateManager.startUpdateFlowForResult(...)), так далее.

Я столкнулся с той же проблемой. Я нашел это в документации для метода startUpdateFlowForResult в классе com.google.android.play.core.appupdate.AppUpdateManager

Каждый экземпляр {@link com.google.android.play.core.appupdate.AppUpdateInfo AppUpdateInfo} можно использовать только в одном вызове этого метода. Если вам нужно вызвать его несколько раз, например, при повторной попытке запустить поток в случае сбоя, вам нужно получить свежий {@link com.google.android.play.core.appupdate.AppUpdateInfo AppUpdateInfo} из {@link #getAppUpdateInfo()}.

Итак, получение нового экземпляра после отмены или неудачного обновления помогло

ЭТОТ ОТВЕТ - ВЗЛОМ!

У меня были проблемы с обновлениями приложений. проблема в том, что эта библиотека была создана для пользователей, которые остаются в той же деятельности, где вызывается из, а затем всякий раз, когда пользователь делает что-то неожиданное, например, проверяет какое-то другое приложение или переходит к следующему действию, все ломается, и обновление не завершается. и вы можете попытаться исправить это с помощью бесконечного шаблона, но поскольку вызов закусочной, которая не зависит от активности, является сверхсложным, это будет стоить вам по крайней мере некоторых седых волос и оставить вас с тонким кодом, который, вероятно, все еще несколько глючит.

АЛЬТЕРНАТИВА

Я наконец сдался и решил перенаправить своих пользователей прямо в GooglePlayStore:

      if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE ) { //maybe you could add some additional checks like priority level here
                makeUpdateDialog(mContext).show();
}

Я использую библиотеку обновлений в приложении исключительно для проверки доступности, а затем показываю диалоговое окно со следующим кодом в кнопке действия:

      try {
                    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(ownGooglePlayLink)));
} catch (android.content.ActivityNotFoundException anfe) {
                    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(ownWebLink)));
}

public static final String ownGooglePlayLink="market://details?id=com.my.package.name";
public static final String ownWebLink="https://play.google.com/store/apps/details?id=com.my.package.name";

Это, по общему мнению, очень взломано, но не так плохо, как кажется. Я считаю, что пользовательский интерфейс остается хорошим, и пользователь может либо пропустить ваше обновление, либо вернуться в приложение после инициализации обновления. таким образом обновление обрабатывается непосредственно Google, и вам не нужно о нем заботиться.

Было бы неплохо, если бы Google предоставил второй диалог, позволяющий пользователю решить, хочет ли он установить приложение, вместо утомительного подхода к закуске.

Официальная документация: https://developer.android.com/guide/app-bundle/in-app-updates

Ограничение: обновление в приложении работает только на устройствах под управлением Android 5.0 (уровень API 21) или выше

Шаг 1: Добавить зависимость:

dependencies {

    implementation 'com.google.android.play:core:1.5.0'
    ...
}

Шаг 2. Проверьте наличие обновлений и запустите, если оно доступно

Создайте экземпляр AppUpdateManagerFactory

 appUpdateManager = AppUpdateManagerFactory.create(context);

Зарегистрируйте слушателя для ответа на ГИБКИЙ запрос на обновление

        appUpdateManager.registerListener(listener);

После этого получает appUpdateInfo

Task<AppUpdateInfo> appUpdateInfo = appUpdateManager.getAppUpdateInfo();

            appUpdateInfo.addOnSuccessListener(new OnSuccessListener<AppUpdateInfo>() {
                @Override
                public void onSuccess(AppUpdateInfo appUpdateInfo) {
                    if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE) {
                        if (appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
                            Log.d("App update A", "Flexible");
                            int updateType = FLEXIBLE;
                            requestUpdate(appUpdateInfo, updateType);
                        } else if (appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
                            Log.d("App update B", "IMMEDIATE");
                            int updateType = IMMEDIATE;
                            requestUpdate(appUpdateInfo, updateType);
                        }
                    }
                }
            });

После этого метода requestUpdate(),

private void requestUpdate(AppUpdateInfo appUpdateInfo, int updateType) {
        try {
            appUpdateManager.startUpdateFlowForResult(appUpdateInfo, updateType, HomeActivity.this, MY_REQUEST_CODE);
        } catch (IntentSender.SendIntentException e) {
            e.printStackTrace();
        }
    }

Шаг 3: Слушайте, чтобы обновить состояние

Наконец слушатель

InstallStateUpdatedListener listener = new InstallStateUpdatedListener() {
        @Override
        public void onStateUpdate(InstallState state) {
            Log.d("installState", state.toString());
            if (state.installStatus() == InstallStatus.DOWNLOADED) {
                // After the update is downloaded, show a notification
                // and request user confirmation to restart the app.
                // SnackBarManager.getSnackBarManagerInstance().showSnackBar(GaanaActivity.this, "An update has just been downloaded.", true);
                popupSnackbarForCompleteUpdate();
            }
        }
    };

метод popupSnackbarForCompleteUpdate(),

private void popupSnackbarForCompleteUpdate() {
        Snackbar snackbar =
                Snackbar.make(findViewById(android.R.id.content), "An update has just been downloaded.", Snackbar.LENGTH_INDEFINITE);
        snackbar.setAction("Restart", view -> appUpdateManager.completeUpdate());
        snackbar.setActionTextColor(getResources().getColor(android.R.color.white));
        snackbar.show();
    }

Шаг 4: Получить обратный звонок для обновления статуса

Вы также можете получить результат,

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == MY_REQUEST_CODE) {
            System.out.println("App Update = " + resultCode);
            if (resultCode != RESULT_OK) {
                System.out.println("Update flow failed! Result code: " + resultCode);
                // If the update is cancelled or fails,
                // you can request to start the update again.
            }
        }
    }

Вы также должны отменить регистрацию слушателя.

@Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("installState", "destroy");
        appUpdateManager.unregisterListener(listener);
    }
Другие вопросы по тегам