Aktualizacja w aplikacji daje InstallException (ERROR_API_NOT_AVAILABLE)

12

Zaimplementowano funkcję aktualizacji w aplikacji za pomocą następującego fragmentu kodu:

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();
    });
}

Testuję aktualizację w aplikacji na urządzeniu z Androidem 9. Nadal wyświetla mi się komunikat o błędzie (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)

Mówi, że sprawdź następujący link: https://developer.android.com/reference/com/google/android/play/core/install/model/InstallErrorCode#ERROR_API_NOT_AVAILABLE )

Korzystanie z podstawowej wersji biblioteki Play: 1.6.5

Najnowsza wersja biblioteki podstawowej:

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

Jednak nie jestem w stanie zrozumieć, dlaczego mówi, że ERROR_API_NOT_AVAILABLE. Każda pomoc będzie mile widziana!

Umang Kothari
źródło
masz odpowiedź?
Ankur_009
Jeszcze nie, ale możesz użyć tego wewnętrznego udostępniania aplikacji do przetestowania aktualizacji InApp: support.google.com/googleplay/android-developer/answer/…
Umang Kothari
masz odpowiedź?
moDev
Masz na to ważną odpowiedź?
Dhaval Kansara
Masz odpowiedź, jak to rozwiązać? Otrzymuję ten sam błąd.
Ashish Agrawal

Odpowiedzi:

5

Po pierwsze , sprawdź, czy korzystasz z najnowszej wersji biblioteki odtwarzania.

Po drugie , zaniżony fakt: sprawdź, czy testowana aplikacja ma taką samą nazwę pakietu, która jest dostępna w sklepie Play.

Przykład:

Masz aplikację w sklepie Play z nazwą pakietu, com.example.appale testujesz ją z nazwą pakietu com.example.app.debug. Otrzymasz ten błąd: ERROR_API_NOT_AVAILABLE

Uwaga: podczas testowania musisz mieć co najmniej jedną wersję aplikacji w sklepie Play.

Vipul Asri
źródło
1. Korzystanie z najnowszej wersji biblioteki odtwarzania. 2. Nazwy pakietów są takie same. W obliczu tego problemu :(
Umang Kothari,
Działa dobrze w kompilacji wersji, ale działa raz w wersji debugowania tylko wtedy, gdy wyczyścisz pamięć podręczną i pamięć Play Store. Aby uruchomić go ponownie, musisz ponownie wyczyścić pamięć podręczną i pamięć Play Store.
Abdul Mateen
1
och, to faktycznie działało dla mnie. Wyczyściłem pamięć podręczną i zapisałem dane w Sklepie Play. Dziękuję @AbdulMateen
gmartinsnull
Myślę, że problem dotyczy również certyfikatu przesłanego do konsoli do gry. Wersja debugowania ma inny certyfikat i nie pasuje do certyfikatu „produkcyjnego”. Dlatego niemożliwe jest przetestowanie interfejsu API nawet przy użyciu FakeUpdateManager
Nicola Gallazzi
2

Moja aplikacja działała dobrze przed dniem dzisiejszym, ale dzisiaj zaczęłam otrzymywać ten błąd. Jednym tymczasowym obejściem jest wyczyszczenie pamięci podręcznej i pamięci Google Play Store, a następnie próba uruchomienia aplikacji. Dla mnie to działa tylko za pierwszym razem, ale potem kończy się niepowodzeniem. Przed ponownym uruchomieniem aplikacji muszę ponownie wyczyścić pamięć podręczną i pamięć. Wydaje mi się, że po stronie sklepu Google Play dzieje się coś złego, przez co ten problem się dzieje, ponieważ przedtem wszystko było dla mnie w porządku.

Abdul Mateen
źródło
2

Oprócz tego, co sugerował Vipal, problem może wynikać z niedopasowania sygnatur między wersją zainstalowaną na urządzeniu a wersją, którą dostarczyłby Sklep Play (jest to powszechny problem, gdy próbujesz przetestować kompilacje debugowania). Zobacz https://developer.android.com/guide/playcore/in-app-updates#troubleshoot

Niedawno Play Core API zaczął zwracać API_NOT_AVAILABLEbłąd, jeśli aplikacja nie jest własnością użytkownika lub niezgodność podpisów, zanim jeszcze zwróciła udane UPDATE_NOT_AVAILABLEzadanie.

Zalecane jest:

  • jeśli korzystasz z rozszerzenia Kotlin, upewnij się, że wychwytujesz zgłoszony wyjątek requestAppUpdateInfo
  • jeśli korzystasz z PlayCore Java, upewnij się, że masz program onFailureListenerobsługujący awariegetAppUpdateInfo
  • w celu przetestowania kompilacji debugowania można użyć wewnętrznego udostępniania aplikacji, jak wyjaśniono tutaj: https://developer.android.com/guide/playcore/in-app-updates#internal-app-sharing

Źródło: Pracuję w zespole Play Core

Alessandro Dovis
źródło
Korzystanie z wewnętrznego udostępniania aplikacji bardzo mi pomogło. Mogę to polecić. Trochę uciążliwe, ale nie wyświetla się żaden komunikat o błędzie „Nie mam sensu”.
MartinJH
0

Tymczasowe obejście tego problemu polega na OnCompleteListener:

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

Aby uniknąć konieczności czyszczenia pamięci podręcznej PlayStore za każdym razem, gdy ponownie uruchamiam aplikację

Nicolas Ducom
źródło
1
Może mógłbyś to zrobić w addOnFailureListener ? Ponieważ wywoływany jest błąd. Mam proces InAppUpdate w BaseActivity i używam interfejsu, aby zwrócić wynik każdemu działaniu, które go potrzebuje.
Sceada
0

Po długim czasie debugowania. Odkryłem, że dzieje się tak, ponieważ testujemy aplikację bezpośrednio na urządzeniach mobilnych. Mimo że generujemy i używamy podpisanego pliku APK, ten błąd wystąpi. Jedynym sposobem na usunięcie tego błędu jest pobranie aplikacji z Google Play.

Możemy użyć wewnętrznego udostępniania aplikacji do testowania lub po prostu opublikować naszą aplikację.

Vimal
źródło