应用内更新出现InstallException(ERROR_API_NOT_AVAILABLE)错误

21

使用以下代码片段实现了应用内更新功能:

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 Update: https://support.google.com/googleplay/android-developer/answer/9303479?hl=en - Umang Kothari
有任何答案吗? - moDev
你有任何有效的答案吗? - Dhaval Kansara
有没有任何答案,如何解决这个问题?我一直在收到同样的错误。 - Ashish Agrawal
7个回答

12
除了Vipal提出的建议之外,该问题可能是由于设备安装版本与Play商店提供的版本签名不匹配导致的(如果您尝试使用调试构建进行测试,则这是一个常见问题)。请参见https://developer.android.com/guide/playcore/in-app-updates#troubleshoot
最近,如果应用程序不属于用户或签名不匹配,则Play Core API会返回一个API_NOT_AVAILABLE错误,而之前它会返回一个成功的UPDATE_NOT_AVAILABLE Task。
建议如下: 来源:我在Play Core团队工作

使用内部应用程序共享对我帮助很大。我可以推荐它。虽然有点繁琐,但可以确保不会出现那些“我毫无意义”的错误消息。 - MartinJH
无法工作,我已经尝试了多次。我使用内部应用程序共享,并从Live Playstore降低版本代码以及从先前的内部应用程序版本降低版本。仍然出现ERROR_API_NOT_AVAILABLE错误。我的证书来自发布密钥库、Google Play密钥库、调试和内部共享,但仍然无法工作。请提供清晰的文档,我真的很沮丧。 - Jetwiz
我拒绝相信这是事实,因为该API在我的工作模拟器中可以正常工作并可用。然而,在家测试时,尽管所有版本都相同,但在测试未从商店安装的应用程序时,仍会出现此错误。这个答案在大多数情况下是正确的。 - andreszs

12

首先,请确认您正在使用 Play 库的最新版本。

其次,需要注意的是:请检查您正在测试的应用程序与 Play 商店中可用的应用程序具有相同的包名称。

例如:

您在 Play 商店上有一个包名称为 com.example.app 的应用程序,但是您正在使用包名称为 com.example.app.debug 的应用程序进行测试。您将收到此错误:ERROR_API_NOT_AVAILABLE

注意:当您进行测试时,您需要在 Play 商店上至少拥有一个应用程序版本。


  1. 使用最新版本的Play库
  2. 包名相同,仍然遇到了这个问题 :(
- Umang Kothari
它在发布版本中运行良好,但仅在调试版本上运行一次,如果您清除Play Store的缓存和存储,则可以再次运行它。要再次运行它,您必须再次清除Play Store的缓存和存储。 - Abdul Mateen
1
哦,这对我真的有用。我清除了Play Store的缓存和存储数据。谢谢@AbdulMateen - gmartinsnull
我认为这个问题也与上传到Play控制台的证书有关。调试版本有一个不同的证书,它与“生产”版本不匹配。因此,即使使用FakeUpdateManager也无法测试API。 - Nicola Gallazzi

2

今天之前我的应用程序一直很好,但是今天开始我遇到了这个错误。一个临时的解决办法是清除您的Google Play商店缓存和存储,然后尝试启动应用程序。对我而言,在第一次使用成功后,它之后就会失败。在再次启动应用程序之前,我必须再次清除缓存和存储。我认为由于某些原因,Google Play商店出现了问题,导致了这个问题,因为在今天之前一切都很好。


1

我遇到了同样的错误,尝试了这里描述的所有解决方案,但都没有成功。

应用程序从Play商店内部测试轨道安装,版本代码为267,然后提交了新的更新到相同的轨道,版本代码为268。

Play商店显示有可用的更新,但应用程序仍然显示ERROR_API_NOT_AVAILABLE。

清除Play商店数据和缓存不能帮助解决问题。

ERROR_API_NOT_AVAILABLE的描述表示“设备上不存在API”。

仔细阅读this page后,我注意到“应用内更新仅支持在Android移动设备、平板电脑和Chrome OS设备上运行的应用程序”。

Android TV没有提到,我想这就是我的情况原因。


0
经过长时间的调试,我发现这是因为我们直接在手机上测试应用程序。即使我们生成并使用签名的apk,这个错误仍然会发生。 摆脱这个错误的唯一方法是,我们需要从Google Play下载该应用程序。
我们可以使用内部应用程序共享来测试或简单地发布我们的应用程序。

0

嗯,在我的情况下,我们清除了Google Play应用程序缓存,并且在启动我们的应用程序之前没有启动Google Play。您必须这样做才能从商店下载新鲜数据,这对于SDK是必要的。


0

目前的临时解决方法是将OnCompleteListener代码块包裹在以下代码中:

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

这样可以避免每次重新启动应用程序都要清除PlayStore缓存的麻烦。


2
也许你可以在 addOnFailureListener 中实现这个功能?因为它会在出现错误时被调用。我将 InAppUpdate 过程放在了 BaseActivity 中,并使用接口将结果返回给需要它的任何 Activity。 - Sceada

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接