Как работать с API обновления Android в приложении? - PullRequest
2 голосов
/ 01 мая 2019

Недавно я столкнулся с новым видом потока обновлений приложений, который может быть предоставлен Google Play. Мне понравился плавный процесс обновления приложения для Android. Я заметил нижеуказанные шаги в приложении Hotstar.

  1. Открыта карта снизу, показывающая, что доступно обновление
  2. Когда я нажал кнопку «Обновить Hotstar», всплыло одно диалоговое окно (похоже, оно предоставлено Google Play)

enter image description here

  1. Загрузка была запущена в фоновом режиме, когда приложение работало
  2. После завершения загрузки выскочил один SnackBar, показывая приложение, готовое к установке
  3. Приложение перезапустилось после установки

enter image description here

Как мне этого добиться? Должен быть способ общения с Google Play. Я просмотрел много блогов. Но, не нашел никакого решения. Это может быть отличной возможностью для разработчика, если автоматическое обновление приложения отключено пользователем.

Ответы [ 5 ]

5 голосов
/ 09 мая 2019

Официальная документация: 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. Проверьте наличие обновлений и запустите, если оно доступно

mAppUpdateManager = AppUpdateManagerFactory.create(this);

mAppUpdateManager.registerListener(installStateUpdatedListener);

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

        if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
                && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)){

            try {    
                    mAppUpdateManager.startUpdateFlowForResult(
                            appUpdateInfo, AppUpdateType.FLEXIBLE, MainActivity.this, RC_APP_UPDATE);
                }

            } catch (IntentSender.SendIntentException e) {
                e.printStackTrace();
            }

        } else if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED){
            popupSnackbarForCompleteUpdate();
        } else {
            Log.e(TAG, "checkForAppUpdateAvailability: something else");
        }
    });

Шаг 3. Прослушивание состояния обновления

InstallStateUpdatedListener installStateUpdatedListener = new 
  InstallStateUpdatedListener() {
    @Override
    public void onStateUpdate(InstallState state) {
        if (state.installStatus() == InstallStatus.DOWNLOADED){
            popupSnackbarForCompleteUpdate();
        } else if (state.installStatus() == InstallStatus.INSTALLED){
            if (mAppUpdateManager != null){
          mAppUpdateManager.unregisterListener(installStateUpdatedListener);
            }

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

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

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RC_APP_UPDATE) {
        if (resultCode != RESULT_OK) {
            Log.e(TAG, "onActivityResult: app download failed");
        }
    }
}

Шаг 5: Гибкое обновление

private void popupSnackbarForCompleteUpdate() {

    Snackbar snackbar =
            Snackbar.make(
                    findViewById(R.id.coordinatorLayout_main),
                    "New app is ready!",
                    Snackbar.LENGTH_INDEFINITE);

    snackbar.setAction("Install", view -> {
        if (mAppUpdateManager != null){
            mAppUpdateManager.completeUpdate();
        }
    });


snackbar.setActionTextColor(getResources().getColor(R.color.install_color));
    snackbar.show();
}
2 голосов
/ 09 мая 2019

Android официально анонсировал обновления для всех пользователей сегодня. https://developer.android.com/guide/app-bundle/in-app-updates

1 голос
/ 15 мая 2019

При попытке реализовать это официальная документация Google, приведенная в принятом ответе, синтаксически неверна.Потребовалось некоторое исследование, но я, наконец, нашел правильный синтаксис:

Вместо:

// Creates an instance of the manager.
AppUpdateManager appUpdateManager = AppUpdateManagerFactory.create(context);

// Returns an intent object that you use to check for an update.
Task<AppUpdateInfo> appUpdateInfo = appUpdateManager.getAppUpdateInfo();

// Checks that the platform will allow the specified type of update.
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
  // For a flexible update, use AppUpdateType.FLEXIBLE
  && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
              // Request the update.

    appUpdateManager.startUpdateFlowForResult(
        // Pass the intent that is returned by 'getAppUpdateInfo()'.
        appUpdateInfo,
        // Or 'AppUpdateType.FLEXIBLE' for flexible updates.
        AppUpdateType.IMMEDIATE,
        // The current activity making the update request.
        this,
        // Include a request code to later monitor this update request.
        MY_REQUEST_CODE);
}

Сделайте это:

    private AppUpdateManager appUpdateManager;
    ...
    // onCreate(){ 
    // Creates instance of the manager.
    appUpdateManager = AppUpdateManagerFactory.create(mainContext);

    // Don't need to do this here anymore
    // Returns an intent object that you use to check for an update.
    //Task<AppUpdateInfo> appUpdateInfo = appUpdateManager.getAppUpdateInfo();

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

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

Затем закодируйте подобный биткод в переопределении onResume () на случай, если установка зависла по пути:

//Checks that the update is not stalled during 'onResume()'.
//However, you should execute this check at all entry points into the app.
@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);
                            } catch (IntentSender.SendIntentException e) {
                                e.printStackTrace();
                            }
                        }
                    });
}
0 голосов
/ 03 мая 2019

Google тестирует раннюю версию API обновления в приложениях, как описано в этом сообщении в блоге .

Это доступно только для некоторых партнеров по раннему тестированию прямо сейчас, но в конечном итоге оно должно быть доступно для всех разработчиков. Следите за блогом разработчиков Android и за объявлениями в консоли Play.

0 голосов
/ 01 мая 2019

Я предполагаю, что оно контролируется самим приложением, а не Google Play. Я разработал приложения, которые делают вызов API при запуске, чтобы прочитать «последний» номер версии и определить, является ли эта версия «обязательным» обновлением или нет, и сравнить его с версией работающего приложения. Если доступна новая версия, пользователю предоставляется диалоговое окно, подобное тому, которое вы отобразили (хотя у него гораздо приятнее), предупреждающее пользователя о наличии обновления. Если обновление является «обязательным», то в сообщении говорится, что они должны обновить приложение, прежде чем продолжить. Если они нажимают «Обновить», они перенаправляются на страницу App Store, где они обычно запускают загрузку обновления и приложение закрывается. Если они нажимают Закрыть, приложение просто закрывается. Если обновление не является обязательным, их спрашивают, хотели бы они обновить сейчас или продолжить. Если они нажимают «Обновить», они перенаправляются на страницу App Store, где они обычно запускают загрузку обновления и приложение закрывается. Если они нажимают «Продолжить», они просто включаются в существующую версию приложения.

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

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