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

时间:2019-09-04 21:12:34

标签: java android-studio

我正在尝试使用AppUpdateManager实施Android In App Update API。我首先尝试按照文档进行操作,如果您在这里,那么您知道那是行不通的。

因此,我读了十几本有关如何使其工作的教程和博客文章。我在那里大约有90%。对于我来说,在用户接受更新之后,下载了更新,我的听众检测到下载已完成,并且我显示了自己的消息并回电了(大多数教程此时都使用了Toast,但是这不应该物)。如果我的用户点击“重新启动”(这是我在显示的消息的“确定”侧添加的标签),则我将调用appUpdateManager.completeUpdate()。

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

问题是没有安装,我可以从我的应用程序版本中得知它仍然是先前版本,并且由于它仍然是先前版本,因此会重新创建appUpdateManager并在检查UpdateAvailability.UPDATE_AVAILABLE时,它会(显然)发现有可用的更新,然后返回整个过程,再次下载并尝试重新启动应用。

我添加了一些日志消息,并检查是否在onActivityResult中得到了RESULT_IN_APP_UPDATE_FAILED,但一切正常。

任何人的任何帮助或建议都很好。

我在MainActivity的开头创建了appUpdateManager的句柄,如下所示:

private AppUpdateManager appUpdateManager;

在创建FLEXABLE 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     受保护的void onActivityResult(int requestCode,int resultCode,@Nullable Intent数据){         super.onActivityResult(requestCode,resultCode,data);         Log.d(TAG,“〜onActivityResult”);         如果(requestCode == MY_REQUEST_CODE){             开关(resultCode){                 案例Activity.RESULT_OK:                     Log.d(TAG,“〜用户批准的更新”);                     打破;                 案例Activity.RESULT_CANCELED:                     Log.d(TAG,“〜用户拒绝更新”);                     打破;                 情况RESULT_IN_APP_UPDATE_FAILED:                     Log.d(TAG,“〜更新失败”);                     打破;             }         }     }

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

最后,当我显示警报时(如果需要,可以是Toast),同时具有“取消”和“重新启动”选项,并显示一条消息,提示“更新下载已完成。”

如果用户按下“重新启动”选项,则它将调用此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 个答案:

答案 0 :(得分:0)

好了,已经过去了一周,显然我已经困扰了整个SO社区。 :)不过,认真地说,过去一周我一直在阅读Android文档和教程,但没有其他答案,所以我只想说Google Update API尚未准备好投入生产。

我找到了替代解决方案。它是

的组合
  1. 使用AppUpdater的答案中提到的question库。
  2. 如果收到用户点击Update的回调,则将使用此意图将他们带到我的Play商店应用列表中。确保将“ com.example.android”替换为自己的应用ID。 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);