Обновление в приложении дает InstallException (ERROR_API_NOT_AVAILABLE)

12

Реализована функция обновления в приложении с использованием следующего фрагмента кода:

private void showInAppUpdateDialog(boolean isMandatoryUpdate) {
    Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();

    appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
        if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
                || appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {

            int appUpdateType = isMandatoryUpdate ? IMMEDIATE : AppUpdateType.FLEXIBLE;
            int requestCode = isMandatoryUpdate ? REQUEST_APP_UPDATE_IMMEDIATE : REQUEST_APP_UPDATE_FLEXIBLE;

            if (appUpdateInfo.isUpdateTypeAllowed(appUpdateType)) {
                // start the app update
                try {
                    appUpdateManager.startUpdateFlowForResult(appUpdateInfo, appUpdateType, targetActivity, requestCode);
                } catch (IntentSender.SendIntentException e) {
                    e.printStackTrace();
                }
            }
        }
    }).addOnFailureListener(e -> {
        e.printStackTrace();
    });
}

Я тестирую обновление в приложении на устройстве с Android 9. Тем не менее оно выдает сообщение об ошибке (ERROR_API_NOT_AVAILABLE):

com.google.android.play.core.install.InstallException: Install Error(-3): The API is not available on this device. (https://developer.android.com/reference/com/google/android/play/core/install/model/InstallErrorCode#ERROR_API_NOT_AVAILABLE)
        at com.google.android.play.core.appupdate.i.a(Unknown Source:24)
        at com.google.android.play.core.internal.o.a(Unknown Source:13)
        at com.google.android.play.core.internal.j.onTransact(Unknown Source:22)
        at android.os.Binder.execTransact(Binder.java:731)

Говорят, что проверьте следующую ссылку: https://developer.android.com/reference/com/google/android/play/core/install/model/InstallErrorCode#ERROR_API_NOT_AVAILABLE )

Использование версии библиотеки ядра Play: 1.6.5

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

implementation 'com.google.android.play:core:1.7.0'

Тем не менее, я не могу понять, почему он говорит, что ERROR_API_NOT_AVAILABLE. Любая помощь будет оценена!

Уманг Котари
источник
есть какой-нибудь ответ?
Ankur_009
Пока нет, но вы можете использовать это внутреннее совместное использование приложения для тестирования обновления InApp: support.google.com/googleplay/android-developer/answer/…
Уманг Котари,
есть какой-нибудь ответ?
MoDev
Есть какой-нибудь правильный ответ на это?
Давал Кансара
Получил ответ, как решить эту проблему? Я получаю ту же ошибку.
Ашиш Агравал

Ответы:

5

Во-первых , пожалуйста, убедитесь, что вы используете последнюю версию библиотеки воспроизведения.

Во-вторых , недооцененный факт: проверьте, что приложение, которое вы тестируете, имеет такое же имя пакета, которое доступно в магазине игр.

Пример:

В магазине Play есть приложение с именем пакета, com.example.appно вы тестируете приложение с именем пакета com.example.app.debug. Вы получите эту ошибку: ERROR_API_NOT_AVAILABLE

Примечание. Во время тестирования в магазине игр должна быть хотя бы одна версия приложения.

Випул Асри
источник
1. Использование последней версии библиотеки воспроизведения 2. Имена пакетов одинаковы. Все еще сталкиваюсь с этой проблемой :(
Уманг Котари
Он отлично работает для сборки выпуска, но запускается один раз в отладочной версии, только если вы очистите кеш и хранилище Play Store. Чтобы запустить его снова, вам необходимо снова очистить кэш и хранилище Play Store.
Абдул Матин
1
о, это действительно сработало для меня. Я очистил кеш и сохранил данные Play Store. Спасибо @AbdulMateen
gmartinsnull
Я думаю, что проблема также связана с сертификатом, загруженным для игры на консоли. Отладочная версия имеет другой сертификат и не соответствует производственному. Таким образом, невозможно проверить API даже с FakeUpdateManager
Никола Галлацци
2

Мое приложение работало нормально до сегодняшнего дня, но я начал получать эту ошибку сегодня. Один из временных способов - очистить кэш и хранилище Google Play Store, а затем попытаться запустить приложение. Для меня это работает только в первый раз, но потом не получается. Перед повторным запуском приложения я должен очистить кеш и хранилище снова. Я думаю, что в Google Play Store что-то не так, из-за чего эта проблема происходит, потому что до сегодняшнего дня у меня все было хорошо.

Абдул Матин
источник
2

Вдобавок к тому, что предложил Vipal, проблема может быть связана с несоответствием подписи между версией, которую вы установили на устройстве, и той, которую поставляет Play Store (это распространенная проблема, если вы пытаетесь протестировать ее с отладочными сборками). См. Https://developer.android.com/guide/playcore/in-app-updates#troubleshoot.

Недавно API Play Core начал возвращать API_NOT_AVAILABLEошибку, если приложение не принадлежит пользователю или несоответствие подписей, в то время как раньше оно использовалось для возврата успешного UPDATE_NOT_AVAILABLEзадания.

Рекомендация:

  • если вы используете расширение Kotlin, убедитесь, что вы перехватываете исключение, выдаваемое requestAppUpdateInfo
  • если вы используете PlayCore Java, убедитесь, что у вас есть, onFailureListenerкоторый обрабатывает сбои изgetAppUpdateInfo
  • для тестирования отладочной сборки вы можете использовать Internal App Sharing, как описано здесь: https://developer.android.com/guide/playcore/in-app-updates#internal-app-sharing

Источник: я работаю в команде Play Core

Алессандро Довис
источник
Использование внутреннего обмена приложениями мне очень помогло. Я могу рекомендовать это. Немного громоздко, но не гарантирует, что ни одно из этих сообщений об ошибке «Я не имею смысла» всплывет.
MartinJH
0

Временный обходной путь на данный момент заключается в том, OnCompleteListenerчтобы:

try {...} catch(e: RuntimeExecutionException) {...}

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

Николас Дюком
источник
1
Может быть, вы могли бы сделать это в addOnFailureListener ? Потому что это вызвано ошибкой. У меня есть процесс InAppUpdate в BaseActivity и я использую интерфейс, чтобы вернуть результат любой деятельности, которая нуждается в нем.
Sceada
0

После долгого времени отладки. Я обнаружил, что это из-за того, что мы тестируем приложение прямо в мобильном телефоне. Даже если мы создаем и используем подписанный apk, эта ошибка произойдет. Единственный способ избавиться от этой ошибки - загрузить приложение из Google Play.

Мы можем использовать внутренний обмен приложениями для тестирования или просто опубликовать наше приложение.

Vimal
источник