当前位置: 首页 > 知识库问答 >
问题:

当调用completeUpdate()时,AppUpdateManager不安装应用程序

仲孙诚
2023-03-14

我正在尝试使用AppUpdateManager在应用程序更新API中实现Android。我首先尝试遵循文档,如果您在这里,那么您知道这是行不通的。

所以我读了十几篇教程和博客文章,介绍了如何实现这个功能。我大概90%在那。对我来说,在用户接受更新后,更新被下载,我的侦听器检测到下载完成,并且我显示自己的消息并回调(大多数教程在这一点上使用了一个Toast(吐司),但这不重要)。如果我的用户点击“restart”,这是我在显示的消息的OK端给出的标签,那么我调用AppUpdateManager.CompleteUpdate()。

此时,我从Google Play获得了一个屏幕,显示了一些漂亮的动画,安装进度条完成后,Google屏幕消失,然后我的应用程序重新启动。

问题是它没有html" target="_blank">安装,我可以从我的应用程序版本看出它仍然是以前的版本,而且由于它仍然是以前的版本,appUpdateManager被重新创建,当它检查updateAvailability.update_Available时,它发现(很明显)有一个可用的更新,然后返回整个过程,再次下载它并尝试重新启动应用程序。

我添加了一些日志消息,并检查了是否在onActivityResult中获得RESULT_IN_APP_UPDATE_FAILED,但它返回得很好。

任何人的任何帮助或建议,将是伟大的。

我在MainActivity开始时为appUpdateManager创建一个句柄,如下所示:

private AppUpdateManager appUpdateManager;

我还创建了一个监听器来监视安装状态,因为我正在努力实现一个可灵活的AppUpdateType,比如:

    private InstallStateUpdatedListener UPDATE_LISTENER = installState -> {
    if (installState.installStatus() == DOWNLOADED) {
        Log.d(TAG, "~UPDATE_LISTENER - installStatus is DOWNLOADED");
        Utility.displayAlert(UPDATE_READY);
    }

    Log.d(TAG, "~Error code is: " + installState.installErrorCode());
    Log.d(TAG, "~Package name is: " + installState.packageName());
};

在onCreate中,我创建了appUpdateManager,注册了下载侦听器,并添加了addOnSuccessListener,如下所示:

Log.d(TAG, "~updateAppIfAvailable");
    // Creates instance of the manager.
    appUpdateManager = AppUpdateManagerFactory.create(this);
    Log.d(TAG, "~registerListener");
    appUpdateManager.registerListener(UPDATE_LISTENER);

    appUpdateManager
        .getAppUpdateInfo()
        .addOnSuccessListener(
            appUpdateInfo -> {

                // Checks that the platform will allow the specified type of update.
                Log.d(TAG, "~updateAvailability is " + appUpdateInfo.updateAvailability());
                if ((appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE)
                        && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
                    // Request the update.
                    try {
                        appUpdateManager.startUpdateFlowForResult(
                                appUpdateInfo,
                                AppUpdateType.FLEXIBLE,
                                this,
                                MY_REQUEST_CODE);
                    } catch (IntentSender.SendIntentException e) {
                        e.printStackTrace();
                    }
                }
            });

我的onActivityResult如下所示:@override protected void onActivityResult(int requestCode,int resultCode,@nullable Intent data){super.onActivityResult(requestCode,resultCode,data);log.d(TAG,“~onActivityResult”);if(requestCode==MY_REQUEST_CODE){switch(resultCode){case activity.result_ok:log.d(TAG,“~User approved Update”);break;

onResume为:

appUpdateManager
        .getAppUpdateInfo()
        .addOnSuccessListener(
            appUpdateInfo -> {

                if (appUpdateInfo.updateAvailability()
                        == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {
                    // If an in-app update is already running, resume the update.
                    try {
                        Log.d(TAG, "~onResume appUpdateManager is calling startUpdateFlowForResult");
                        appUpdateManager.startUpdateFlowForResult(
                                appUpdateInfo,
                                AppUpdateType.FLEXIBLE,
                                this,
                                MY_REQUEST_CODE);
                    } catch (IntentSender.SendIntentException e) {
                        e.printStackTrace();
                    }
                }
            });

最后,当我显示警报时(如果您想要的话,这可能是一个祝酒词),我有一个取消和一个重启选项,并带有一条消息,上面写着“更新下载已完成”(update download is complete)。

如果用户按下“restart”选项,那么它会调用这个updateAndRestart()方法:

private void updateAndRestart() {
    Log.d(TAG, "~updateAndRestart");
    Log.d(TAG, "~Completing app update.");
    if (appUpdateManager != null) {
        appUpdateManager.completeUpdate();
        Log.d(TAG, "~unregisterListener");
        appUpdateManager.unregisterListener(UPDATE_LISTENER);
    }
}

共有1个答案

姚向晨
2023-03-14

好吧,已经一个星期了,显然我把整个SO社区都难倒了。:)说真的,在过去的一周里,我一直在阅读Android文档和教程,我没有其他答案,所以我要说的是,Google Update API还没有准备好投入生产。

我找到了另一种解决办法。它是一种组合

  1. 使用本问题答案中提到的AppUpdater库。
  2. 如果我得到用户点击Update的回调,那么我将他们带到我的Play Store应用列表,使用这个意图。确保用自己的应用程序ID替换“com.example.android”。这个google doc页面向您展示了如何执行此操作。
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.example.android"));
intent.setPackage("com.android.vending");
startActivity(intent);
 类似资料:
  • 我在Play Store中有一个应用程序。 现在,我需要用更新的版本来更新它。在将其推送到Playstore之前,我想我会用APK检查迁移。 我从Playstore安装了现有版本。现在,我试图安装最新的(签名)apk。但它说,应用程序无法安装。 这个确切的案例正在与Playstore合作。我尝试了发行版。它工作正常。 我错过什么了吗。。? 提前谢谢

  • 我有一个android的设备,我在上面调试应用程序。在我生成签名apk后,我卸载了现有的调试应用程序,尝试安装签名apk,但我得到了应用程序未安装的错误。我安装在一个没有调试应用程序安装的新设备上,看起来还可以。我尝试清除应用程序数据并卸载,但没有工作。 图像错误

  • 我知道有“重复”这一点,但他们都说同样的事情,我已经试过了。< br >我已经将SHA1和SHA256密钥添加到firebase项目中。< br > OTP验证在调试模式下或当我手动安装release apk时运行良好。但它不会当应用程序从play store下载时,OTP根本不会发送。

  • 我正在尝试获取iOS应用程序中的用户位置。我首先在我的项目中包括了corelocation框架。然后点击一个按钮,我调用核心位置api,如下所示。当我试图将其安装到设备中时,核心位置从不请求用户权限。当我尝试在单击按钮时获取位置时,我得到的KClauthorizationStatusNotDetected为AuthorizationStatus。请帮我做这件事。我不知道发生了什么事。 这是我的sh

  • 我在Udemy上学习“现代React with Redux课程”,讲师要求先安装NodeJs,然后安装“npm安装-g创建React应用程序”,当我尝试运行此命令时,我遇到一个错误:- 然后我讨论了有关stackoverflow的一些问题,其中有人建议运行以下命令:- 我得到了: 然后我运行 再次命令,但仍然得到相同的错误,任何解决方案/建议?

  • 我有一个已经在商店中的应用程序,现在我正忙着做一些更改,我想在提交更新到商店之前在设备上测试。 更改后,我为iOS发送了一个调试版本。当我尝试在我的设备上安装应用程序时,什么也没发生,甚至没有显示codename-one.appspot.com想安装“应用程序名称”的常规对话框。 我还尝试在我的苹果电脑上通过iTunes安装应用程序,但安装失败。 我在使用iFunbox时也遇到了一个错误。 我的应