Предложите пользователям обновить приложение Android с помощью Google Play (поддержка Google In-App Update)

Я видел, что это диалоговое окно всегда появляется, когда я открываю старую версию Tokopedia приложение. Токопедия предлагает мне обновить приложение.

введите описание изображения здесь

В диалоговом окне есть два метода обновления приложения:

  • Обновить сейчас
  • Обновлять, когда доступен Wi-Fi

Если я выберу Lain Kali (Отмена), диалоговое окно появится снова при следующем открытии приложения. Но если я выберу второй вариант, я открываю Play Store и вижу такое поведение:

введите описание изображения здесь

Он действительно обновляется в фоновом режиме, пока мое устройство не будет подключено к Wi-Fi.

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

Вы знаете, как показать приведенный выше диалог?


person Anggrayudi H    schedule 27.06.2019    source источник
comment
Лучше создать новую веб-службу на первом экране вашего приложения. Он предоставит последнюю версию приложения в игровом магазине и другие необходимые данные. Вам необходимо сравнить версию установленного приложения с версией, полученной в ответе веб-службы. Затем вы можете показать диалог.   -  person DAS    schedule 27.06.2019
comment
@SibinDavis У меня есть веб-сервис, который определяет, используют ли пользователи старую версию или нет. Теперь вопрос, как показать диалог? И когда пользователи нажимают «Обновить», диалоговое окно сообщает Play Store, что нужно обновить наше приложение. Я уверен, что диалог исходит из Google Play Service API.   -  person Anggrayudi H    schedule 27.06.2019
comment
Нет необходимости в Google Play Service API. Вы можете создать диалоговое окно, подобное приведенному выше, и, нажав кнопку обновления, вы можете перенаправить на страницу вашего приложения в магазине. И если они нажимают кнопку отмены, вы можете закрыть диалоговое окно и перенаправить на следующий экран.   -  person DAS    schedule 27.06.2019


Ответы (3)


Это возможно с помощью встроенного обновления, предоставляемого Google.

Обновления в приложении работают только с устройствами под управлением Android 5.0 (уровень API 21) или выше и требуют использования библиотеки Play Core 1.5.0 или выше. Есть два типа - 1. Гибкий и 2. Немедленный.

Перейдите по этой ссылке и выполните обновление в приложении в соответствии с вашими требованиями.

https://developer.android.com/guide/app-bundle/in-app-updates

person Anupam    schedule 27.06.2019
comment
Это единственный способ реализовать это. Спасибо за поддержку. @Anggrayudi H Спасибо. - person Anupam; 27.06.2019
comment
@AnggrayudiH Это работает? Тогда я хочу использовать этот метод - person DAS; 27.06.2019
comment
Это относительно недавно и предложено Google. Такие приложения, как PayTm, используют это. - person Anupam; 27.06.2019
comment
Ваше здоровье !! Удачного кодирования. - person Anupam; 27.06.2019
comment
Могу ли я использовать это, даже если я не использую комплект приложений для Android? - person akshay_shahane; 27.06.2019
comment
Думаю, это работает, потому что спецификации как таковой нет. - person Anupam; 27.06.2019
comment
@AnggrayudiH не могли бы вы пролить свет на это, как вы это реализовали? - person akshay_shahane; 27.06.2019
comment
@akshay_shahane Я сделаю это. - person Anggrayudi H; 27.06.2019
comment
Я буду работать без пакета приложений для Android. Я уже реализовал. Извините! Я не мог тебя понять раньше. - person Anupam; 27.06.2019

Вы можете добиться этого, используя Поддержка обновлений в приложении

  • Работает только с Android 5.0 (уровень API 21) или выше.

  • Существует два типа обновлений, доступных с UX для обновлений внутри приложения:

    • Flexible
    • Немедленный

Чтобы проверить наличие обновлений

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

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

// Checks that the platform will allow the specified type of update.
appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
    if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
          // For a flexible update, use AppUpdateType.FLEXIBLE
          && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
              // Request the update.
    }
});
person Nikunj    schedule 27.06.2019

Хорошо, вот полный код, запрошенный @akshay_shahane.

Во-первых, добавьте эту строку в build.gradle вашего приложения:

dependencies {
    implementation 'com.google.android.play:core:1.6.1'
}

А внутри вашей активности:

class MainActivity : AppCompatActivity(), InstallStateUpdatedListener {

    private val appUpdateManager by lazy {
        AppUpdateManagerFactory.create(this).also { it.registerListener(this) }
    }

    override fun onDestroy() {
        if (Build.VERSION.SDK_INT >= 21) {
            appUpdateManager.unregisterListener(this)
        }
        super.onDestroy()
    }

    override fun onResume() {
        super.onResume()
        if (Build.VERSION.SDK_INT >= 21) {
            appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo ->
                // If the update is downloaded but not installed, notify the user to complete the update.
                if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED) {
                    popupSnackbarForCompleteUpdate()
                } else if (it.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS
                        && it.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
                    appUpdateManager.startUpdateFlowForResult(it, AppUpdateType.IMMEDIATE, this, REQUEST_CODE_UPDATE_APP)
                }
            }
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode == ActivityResult.RESULT_IN_APP_UPDATE_FAILED && requestCode == REQUEST_CODE_UPDATE_APP) {
            Toast.makeText(this, "Update failed", Toast.LENGTH_SHORT).show()
        }
    }

    override fun onStateUpdate(state: InstallState) {
        when (state.installStatus()) {
            InstallStatus.DOWNLOADED -> popupSnackbarForCompleteUpdate()
            InstallStatus.REQUIRES_UI_INTENT -> {
                Snackbar.make(findViewById(R.id.activity_main_layout),
                        "To perform the installation, a Play Store UI flow needs to be started.",
                        Snackbar.LENGTH_LONG
                ).show()
            }
            else -> {
                val stateString = when (state.installStatus()) {
                    InstallStatus.FAILED -> "failed"
                    InstallStatus.PENDING -> "pending"
                    InstallStatus.DOWNLOADING -> "downloading"
                    InstallStatus.INSTALLING -> "installing"
                    InstallStatus.INSTALLED -> "installed"
                    InstallStatus.CANCELED -> "canceled"
                    else -> null
                }
                if (stateString != null) {
                    Snackbar.make(findViewById(R.id.activity_main_layout),
                            "An update is $stateString.",
                            Snackbar.LENGTH_SHORT
                    ).show()
                }
            }
        }
    }

    private fun popupSnackbarForCompleteUpdate() {
        Snackbar.make(findViewById(R.id.activity_main_layout),
                "An update is ready to install.",
                Snackbar.LENGTH_INDEFINITE
        ).apply {
            setAction("INSTALL") { appUpdateManager.completeUpdate() }
            show()
        }
    }

    @RequiresApi(21)
    fun checkUpdateViaGooglePlay() {
        appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo ->
            when (appUpdateInfo.updateAvailability()) {
                UpdateAvailability.UPDATE_AVAILABLE -> {
                    if (appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
                        appUpdateManager.startUpdateFlowForResult(
                            appUpdateInfo, AppUpdateType.FLEXIBLE, this, REQUEST_CODE_UPDATE_APP)
                    } else if (appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
                        appUpdateManager.startUpdateFlowForResult(
                            appUpdateInfo, AppUpdateType.IMMEDIATE, this, REQUEST_CODE_UPDATE_APP)
                    }
                }
                UpdateAvailability.UPDATE_NOT_AVAILABLE -> {
                    Toast.makeText(this, R.string.no_updates_found, Toast.LENGTH_SHORT).show()
                }
            }
        }.addOnFailureListener {
            Toast.makeText(this, R.string.error_check_update, Toast.LENGTH_SHORT).show()
        }
    }

    companion object {
        const val REQUEST_CODE_UPDATE_APP = 8
    }
}
person Anggrayudi H    schedule 27.06.2019