La mise à jour intégrée donne InstallException (ERROR_API_NOT_AVAILABLE)

12

Fonctionnalité de mise à jour intégrée à l'application, à l'aide de l'extrait de code suivant:

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

Je teste la mise à jour de l'application sur l'appareil équipé d'Android 9. Pourtant, cela me donne suite à une erreur (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)

Il dit que vérifiez le lien suivant: https://developer.android.com/reference/com/google/android/play/core/install/model/InstallErrorCode#ERROR_API_NOT_AVAILABLE )

Utilisation de la version de la bibliothèque principale de Play: 1.6.5

Dernière version de la bibliothèque principale:

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

Cependant, je ne suis pas en mesure de comprendre pourquoi il indique que ERROR_API_NOT_AVAILABLE. Toute aide serait appréciée!

Umang Kothari
la source
obtenu une réponse?
Ankur_009
Pas encore, mais, Vous pouvez utiliser ce partage d'application interne pour tester la mise à jour InApp: support.google.com/googleplay/android-developer/answer/…
Umang Kothari
obtenu une réponse?
moDev
Vous avez une réponse valable à cela?
Dhaval Kansara
Vous avez une réponse, comment résoudre ce problème? Je reçois la même erreur.
Ashish Agrawal

Réponses:

5

Tout d'abord , veuillez vérifier que vous utilisez la dernière version de la bibliothèque de jeux.

Deuxièmement , fait sous-estimé: veuillez vérifier que l'application que vous testez a le même nom de package que celui disponible sur le Play Store.

Exemple:

Vous avez une application sur le Play Store avec le nom du package com.example.appmais vous testez votre application avec le nom du package com.example.app.debug. Vous obtiendrez cette erreur: ERROR_API_NOT_AVAILABLE

Remarque: Vous devez avoir au moins une version de votre application sur le Play Store lorsque vous testez.

Vipul Asri
la source
1. Utilisation de la dernière version de la bibliothèque de jeu 2. Les noms des packages sont les mêmes Toujours, face à ce problème :(
Umang Kothari
Cela fonctionne bien pour la version Release, mais ne s'exécute une fois sur la version Debug que si vous videz votre cache et votre stockage Play Store. Pour l'exécuter à nouveau, vous devez à nouveau vider le cache et le stockage de Play Store.
Abdul Mateen
1
oh cela a vraiment fonctionné pour moi. J'ai effacé le cache et stocké les données de Play Store. Merci @AbdulMateen
gmartinsnull
Je pense que le problème est également lié au certificat téléchargé sur la console de jeu. La version de débogage a un certificat différent et il ne correspond pas à celui de "production". Il est donc impossible de tester l'API même avec FakeUpdateManager
Nicola Gallazzi
2

Mon application fonctionnait bien avant aujourd'hui, mais j'ai commencé à recevoir cette erreur aujourd'hui. Une solution de contournement temporaire consiste à effacer le cache et le stockage de votre Google Play Store, puis essayez de lancer l'application. Pour moi, cela ne fonctionne que la première fois, mais échoue ensuite. Avant de relancer l'application, je dois à nouveau vider le cache et le stockage. Je pense qu'il y a un problème du côté de Google Play Store à cause duquel ce problème se produit, car tout allait bien pour moi avant aujourd'hui.

Abdul Mateen
la source
2

En plus de ce que Vipal a suggéré, le problème peut être dû à un décalage de signature entre la version que vous avez installée sur l'appareil et celle que Play Store fournirait (c'est un problème courant si vous essayez de le tester avec des versions de débogage). Voir https://developer.android.com/guide/playcore/in-app-updates#troubleshoot

Récemment, l'API Play Core a commencé à renvoyer une API_NOT_AVAILABLEerreur si l'application n'appartient pas à l'utilisateur ou si les signatures ne correspondent pas, alors qu'auparavant, elle renvoyait une UPDATE_NOT_AVAILABLEtâche réussie .

La recommandation est:

  • si vous utilisez l'extension Kotlin, assurez-vous que vous interceptez l'exception levée par requestAppUpdateInfo
  • si vous utilisez PlayCore Java, assurez-vous que vous disposez d'un onFailureListenerqui gère les échecs degetAppUpdateInfo
  • afin de tester une version de débogage, vous pouvez utiliser le partage d'application interne, comme expliqué ici: https://developer.android.com/guide/playcore/in-app-updates#internal-app-sharing

Source: Je travaille sur l'équipe Play Core

Alessandro Dovis
la source
L'utilisation du partage d'application interne m'a beaucoup aidé. Je peux le recommander. Un peu lourd, mais assure qu'aucun de ces messages d'erreur «Je n'ai aucun sens» n'apparaît.
MartinJH
0

Une solution temporaire pour le moment consiste à entourer le OnCompleteListener:

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

Juste pour éviter d'avoir à vider le cache PlayStore à chaque fois que je relance l'application

Nicolas Ducom
la source
1
Peut-être pourriez-vous le faire dans addOnFailureListener ? Parce que cela s'appelle sur une erreur. J'ai le processus InAppUpdate dans une BaseActivity et j'utilise une interface pour rendre le résultat à toute activité qui en a besoin.
Sceada
0

Après une longue période de débogage. J'ai trouvé, c'est parce que nous testons l'application directement sur mobile. Même si nous générons et utilisons l'apk signé, cette erreur se produira. La seule façon de se débarrasser de cette erreur est de télécharger l'application depuis Google Play.

Nous pouvons utiliser le partage d'application interne pour tester ou simplement publier notre application.

Vimal
la source