Android AppUpdateManager не инициализирует автоматическое обновление

#java #android #google-play

#java #Android #google-play

Вопрос:

Я хочу немедленно обновлять свое приложение каждый раз, когда публикую обновление. Я следовал инструкциям из официальной документации Android о том, как протестировать функцию автоматического обновления, но ничего не происходит. Я разместил несколько журналов, чтобы проверить, инициализируются ли эти функции, но logcat также ничего не показывает. Это проблема в моем синтаксисе, или я должен разместить эти функции где-то еще? В настоящее время весь мой код обновления написан внутри основного, начального класса приложения.

В методе create класса

 private static final int REQUEST_APP_UPDATE = 560;
private AppUpdateManager appUpdateManager;
private InstallStateUpdatedListener installStateUpdatedListener;
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    appUpdateManager = AppUpdateManagerFactory.create(this);


    installStateUpdatedListener = new
            InstallStateUpdatedListener() {
                @Override
                public void onStateUpdate(InstallState state) {
                    if (state.installStatus() == InstallStatus.DOWNLOADED){

                    } else if (state.installStatus() == InstallStatus.INSTALLED){
                        if (appUpdateManager != null){
                            appUpdateManager.unregisterListener(installStateUpdatedListener);
                        }

                    } else {
                        Log.i(TAG, "InstallStateUpdatedListener: state: "   state.installStatus());
                    }
                }
            };

    appUpdateManager
            .getAppUpdateInfo()
            .addOnSuccessListener(
                    appUpdateInfo -> {
                        Log.d("TAG", "here");

                        // Checks that the platform will allow the specified type of update.
                        if ((appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE)
                                amp;amp; appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE))
                        {
                            // Request the update.
                            try {
                                Log.d("TAG", "here");
                                appUpdateManager.startUpdateFlowForResult(
                                        appUpdateInfo,
                                        AppUpdateType.IMMEDIATE,
                                        this,
                                        REQUEST_APP_UPDATE);
                            } catch (IntentSender.SendIntentException e) {
                                e.printStackTrace();
                            }
                        }
                    });

    appUpdateManager.registerListener(installStateUpdatedListener);
   ...
  

При возобновлении и при остановке методов обработки:

  @Override
protected void onResume() {
    super.onResume();

    appUpdateManager
            .getAppUpdateInfo()
            .addOnSuccessListener(
                    appUpdateInfo -> {

                        if (appUpdateInfo.updateAvailability()
                                == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {
                            // If an in-app update is already running, resume the update.
                            try {
                                appUpdateManager.startUpdateFlowForResult(
                                        appUpdateInfo,
                                        AppUpdateType.IMMEDIATE,
                                        this,
                                        REQUEST_APP_UPDATE);
                                Log.d("TAG", "tu");
                            } catch (IntentSender.SendIntentException e) {
                                e.printStackTrace();
                            }
                        }
                    });
}
@Override
protected void onStop() {
    super.onStop();
    if (appUpdateManager != null) {
        appUpdateManager.unregisterListener(installStateUpdatedListener);
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_APP_UPDATE) {
        if (resultCode != RESULT_OK) {
            Log.d("TAG", "Update flow failed! Result code: "   resultCode);
            // If the update is cancelled or fails,
            // you can request to start the update again.
        }
    }
}
  

Комментарии:

1. Используете ли вы внутреннюю дорожку для публикации?

2. Да, все обновления, которые я тестировал, были внутренними обновлениями.

Ответ №1:

Я предлагаю вам переместить все ваши AppUpdateInfo извлечения в onResume() , поскольку это более надежная точка входа в действие (например, если действие перешло в фоновый режим, а затем было снова открыто пользователем). Метод onCreate будет вызван, только если действие было уничтожено, поскольку после повторного открытия приложения вы можете не увидеть диалоговое окно обновления, если оно было свернуто.

 @Override
public void onResume() {
    super.onResume();
    appUpdateManager.getAppUpdateInfo().addOnSuccessListener( info -> {
        boolean isStalledUpdate = info.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS;
        boolean isReadyForUpdate = 
            info.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
            amp;amp; info.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE;

        if (isReadyForUpdate || isStalledUpdate) {
                appUpdateManager.startUpdateFlowForResult(
                    info, 
                    AppUpdateType.IMMEDIATE, 
                    this, 
                    REQ_CODE
                );
        }
}
  

Иногда приложение не синхронизируется автоматически с обновлениями Play Store, поэтому вам необходимо выполнить следующее:

Убедитесь, что у вас есть обновление, доступное вручную — зайдите в Play Store, проверьте наличие обновлений и убедитесь, что у вас есть обновление, доступное для вашего приложения. После этого откройте ваше приложение (ваше действие, вызывающее диспетчер обновлений в onResume ), и вы увидите диалоговое окно немедленного обновления.

Кроме того, один совет для вас — заставьте вашу активность реализовать InstallStateUpdateListener и переопределить метод onStateUpdate , подобный этому, для обработки разных событий.

 @Override
public void onResume() {
    // All previous logic 
    // If update is available or was stalled call this
    appUpdateManager.registerListener(this);
}

@Override
public void onStateUpdate(InstallState state) {
    if (state == null) return;
    switch (state.installStatus()) {
        case InstallStatus.INSTALLED: 
            appUpdateManager.unregisterListener(this)
            return;
        case InstallStatus.FAILED:
            appUpdateManager.unregisterListener(this)
            return;
        case InstallStatus.CANCELED:
            appUpdateManager.unregisterListener(this)
            return;
        default:
            // provide your own logic
            return;
    }
}
  

Это поможет вам избежать вызова отдельного экземпляра listener в методах жизненного цикла activity.

Комментарии:

1. Я переместил код в onResume, обновил проект в консоли Google Play, вручную искал обновления на своем устройстве, протестировал его, и, похоже, он по-прежнему не работает, ничего не происходит.

2. @Xarxes вы должны убедиться, что вы находитесь на внутреннем треке и обновление доступно в play Store. Вы видите сообщение, подобное этому, на скриншоте? i.stack.imgur.com/AZ142.jpg

3. мое обновление доступно для загрузки в Play Store, я не обновляю его, после проверки, возможно ли обновление, я направляюсь прямо к своему приложению, но ничего не происходит. У меня есть сообщение, предупреждающее меня о внутреннем тестировании.

4. @Xarxes это довольно интересно. Вы зарегистрировали onsucclistener информации об обновлении вашего приложения? Вызывается ли код при условии доступности обновления?

5. Мои журналы: AppUpdateService: requestUpdateInfo («имя приложения») AppUpdateService : инициирует привязку к сервису. AppUpdateListenerRegistry : registerListener AppUpdateService: requestUpdateInfo(com.sunfamily.bonus) AppUpdateListenerRegistry : registerListener AppUpdateService : ожидает привязки к сервису. AppUpdateService: ServiceConnectionImpl.onServiceConnected(ComponentInfo{com.android.vending/com.google.android.finsky.installservice. DevTriggeredUpdateService}) AppUpdateService: linkToDeath OnRequestInstallCallback: onRequestInfo AppUpdateService: отвязаться от службы.

Ответ №2:

Код, который я предоставил, работал, проблема отсутствия обновления заключалась в том, что само устройство не знало, доступно ли обновление. После обновления списка обновлений в Play Store диспетчер обновлений приложений инициализировал окно автоматического обновления при запуске приложения.

Комментарии:

1. Магазин Google Play показывает, что доступно обновление, но inAppUpdate, похоже, не распознает его. Есть идеи?