Как имитировать onFailureListener & resultCode! = Activity.RESULT_OK в обновлениях приложений? - PullRequest
2 голосов
/ 27 мая 2020

Как я могу протестировать это onFailureListener & resultCode! = Activity.RESULT_OK ?

Когда я открываю приложение, я создаю состояние принудительного обновления в зависимости от моего versionName обоих приложений, совместно используемых Внутренний доступ в Google Play.

Сначала он покажет мне настраиваемый диалог. При отрицательном Btn -> Приложение закрывается

При положительном Btn -> Начнется игра checkForUpdate ().

Я использую AppUpdateType.IMMEDIATE. Так что он покажет мне только диалог Google Play для ОБНОВЛЕНИЯ.

Я только что сделал сборку для inAppUpdates и пытаюсь обработать onFailureListener. Не помещая только printstacktrace, я хочу открыть Google Play и позволить пользователю установить приложение оттуда.

fun checkForAppUpdate() {
        val appUpdateManager = AppUpdateManagerFactory.create(this)
        val appUpdatedListener: InstallStateUpdatedListener by lazy {
            object : InstallStateUpdatedListener {
                override fun onStateUpdate(installState: InstallState) {
                    if(installState.installStatus() == InstallStatus.INSTALLED) {
                        appUpdateManager.unregisterListener(this)
                    }
                    else {Log.d("inAPPtag","InstallStateUpdatedListener: state: %s" + installState.installStatus())
                    }
                }
            }
        }
        // Returns an intent object that you use to check for an update.
        val appUpdateInfoTask = appUpdateManager.appUpdateInfo
        // Checks that the platform will allow the specified type of update.
        appUpdateInfoTask.addOnSuccessListener { appUpdateInfo ->
            if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE || appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {

                appUpdateManager.registerListener(appUpdatedListener)
                // Request the update.
                try {
                    appUpdateManager.startUpdateFlowForResult(
                        appUpdateInfo,
                        AppUpdateType.IMMEDIATE,
                        this,
                         APP_UPDATE_REQUEST_CODE
                    )
                } catch (e: IntentSender.SendIntentException) {
                    e.printStackTrace()
                }
            }
        }
        appUpdateInfoTask.addOnFailureListener {
            it.printStackTrace()
            val intent = Intent(Intent.ACTION_VIEW, Uri.parse(Constants.STORE_URL))
            if (intent.resolveActivity(this.packageManager) != null) {
                splashTrace.putAttribute("SPLASH", "appUpdate")
                startActivity(intent)
                finish()
            }
        }
    }

Кроме того, если resultCode! = Activity.RESULT_OK. То же самое, чтобы пользователь мог установить приложение из Google Play.

if (requestCode == APP_UPDATE_REQUEST_CODE) {
           if (resultCode != Activity.RESULT_OK) {
               val intent = Intent(Intent.ACTION_VIEW, Uri.parse(Constants.STORE_URL))
               if (intent.resolveActivity(this.packageManager) != null) {
                   splashTrace.putAttribute("SPLASH", "appUpdate")
                   startActivity(intent)                    
                   finish()
                }
            }
        }

1 Ответ

1 голос
/ 28 мая 2020

У вас есть два места, где вы пытаетесь отловить ошибку в своем приложении.

Первое - это исключение SendIntentException, согласно документации здесь говорится, что:

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

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

Вторая ошибка - appUpdateInfoTask.addOnFailureListener {. Я считаю, что этот сработает, если на телефоне нет магазина Google Play или если устройство не имеет rnet подключения.

Что касается вашего второго вопроса, вы можете проверить здесь . Для onActivityResult у вас есть три варианта:

  1. RESULT_OK: обновление прошло успешно
  2. RESULT_CANCELED: пользователь нажал кнопку возврата
  3. RESULT_FIRST_USER: поток, определенный пользователем
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...