【问题标题】:AppUpdateManager.startUpdateFlowForResult not showing dialogAppUpdateManager.startUpdateFlowForResult 不显示对话框
【发布时间】:2019-08-17 08:21:18
【问题描述】:

我正在尝试实现android in-app updates。我正在按照官方门户中给出的教程进行操作,但是调用 startUpdateflow 方法时未显示该对话框。请在下面找到我正在执行的代码块。

final AppUpdateManager appUpdateManager = AppUpdateManagerFactory.create(this);
    Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();
    appUpdateInfoTask.addOnSuccessListener(new OnSuccessListener<AppUpdateInfo>() {
        @Override
        public void onSuccess(AppUpdateInfo appUpdateInfo) {
            try {
                Toast.makeText(getApplicationContext(),"Success.", Toast.LENGTH_SHORT).show();
                appUpdateManager.startUpdateFlowForResult(
                        appUpdateInfo,
                        AppUpdateType.FLEXIBLE,
                        SplashScreenActivity.this,
                        APP_UPDATE_REQUEST_CODE
                );
            } catch (IntentSender.SendIntentException e) {
                Toast.makeText(getApplicationContext(),"Exception received", Toast.LENGTH_SHORT).show();
                e.printStackTrace();
            }
        }
    });

我可以看到成功祝酒和线路

appUpdateManager.startUpdateFlowForResult() is called

但这并没有显示门户中显示的带有“不感谢”和“更新”按钮的更新对话框。我也尝试过使用FakeAppUpdateManager,但这也没有帮助。

在这里请求帮助!

【问题讨论】:

  • 嘿,解决了吗?我也面临同样的问题。请帮忙。
  • 很遗憾没有 @user2190487 如果您找到解决方案,请在此处更新。
  • 你用的是什么设备?
  • @VadimKotov 我尝试使用我的 OnePlus 6 和 Pocophone。

标签: android android-intent in-app-update


【解决方案1】:

这是我注意到的;换句话说,您的里程可能会有所不同。

In-app Update 像宣传的那样工作,但为了使其按您期望的方式工作,需要做好几件事。

  1. 您需要从 Google Play 安装您的测试应用;如果你只是从 Android Studio 安装它是行不通的。

  2. 可以通过“开放测试”、“封闭测试”或“内部测试”从 Google Play 安装它,但(我认为)这些轨道只允许发布版本(即不能设置断点),所以我建议您从“内部应用共享”开始。只需将您的.apk.aab 上传到https://play.google.com/console/internal-app-sharing。唯一似乎不起作用的是在“内部应用程序共享”中设置更新优先级。我想听听其他人是如何处理的。

  3. FakeAppUpdateManager 不显示更新对话框。您只需通过发出命令(例如 fakeAppUpdateManager.downloadStarts())来模拟 Google Play 会做什么,但不会有任何对话框。参考this

  4. 更新可以同时是FLEXIBLEIMMEDIATE。换句话说,如果你检查appUpdateInfo.isUpdateTypeAllowed(FLEXIBLE)appUpdateInfo.isUpdateTypeAllowed(IMMEDIATE),它们可以都是true。您可以根据更新的优先级来决定此时要做什么。

这些是我采取的步骤。

  1. versionCode 设置为2,构建.apk.aab(调试版),并将其上传到“内部应用共享”。记下其下载 URL。

  2. versionCode设置为1,与步骤1相同。

  3. 从手机打开第 2 步中的 URL(即版本 1)。它将打开 Google Play 并要求您下载该应用程序。下载并打开它。

  4. 从手机打开第 1 步中的 URL(即版本 2),但不要点击“更新”按钮;只需将应用版本 1 置于前台即可。

  5. 在应用运行时,附加调试器(Android Studio -> 运行 -> 将调试器附加到 Android 进程)。

  6. 检查更新(appUpdateManager.appUpdateInfo.addOnSuccessListener {...})、启动更新(appUpdateManager.startUpdateFlowForResult(...))等

【讨论】:

  • 嘿,谢谢你的回答,这对测试它很有帮助。我有一个问题,应用程序是否在立即更新后重新启动?这对我不起作用,我想知道是否有什么在我身边
  • 我不确定它是怎么回事,所以我又试了一次。当我使用“IMMEDIATE”调用 appUpdateManager.startUpdateFlowForResult() 时,应用会在更新后自动重启。
【解决方案2】:

我也遇到了同样的问题。 我在 com.google.android.play.core.appupdate.AppUpdateManager 类中的 startUpdateFlowForResult 方法的文档中找到了这个

每个 {@link com.google.android.play.core.appupdate.AppUpdateInfo AppUpdateInfo} 实例只能在对该方法的一次调用中使用。如果你 需要多次调用它 - 例如,在失败的情况下重试启动流程时,您需要从 {@link #getAppUpdateInfo 获取新的 {@link com.google.android.play.core.appupdate.AppUpdateInfo AppUpdateInfo} ()}。

所以,在取消或更新失败后获取新实例就可以了

【讨论】:

    【解决方案3】:

    官方文档: https://developer.android.com/guide/app-bundle/in-app-updates

    限制:应用内更新仅适用于运行 Android 5.0(API 级别 21)或更高版本的设备

    第 1 步: 添加依赖项:

    dependencies {
    
        implementation 'com.google.android.play:core:1.5.0'
        ...
    }
    

    第 2 步:检查更新是否可用,如果可用则开始

    创建 AppUpdateManagerFactory 的实例

     appUpdateManager = AppUpdateManagerFactory.create(context);
    

    为 FLEXIBLE 更新请求的响应注册监听器

            appUpdateManager.registerListener(listener);
    

    之后获取 appUpdateInfo

    Task<AppUpdateInfo> appUpdateInfo = appUpdateManager.getAppUpdateInfo();
    
                appUpdateInfo.addOnSuccessListener(new OnSuccessListener<AppUpdateInfo>() {
                    @Override
                    public void onSuccess(AppUpdateInfo appUpdateInfo) {
                        if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE) {
                            if (appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
                                Log.d("App update A", "Flexible");
                                int updateType = FLEXIBLE;
                                requestUpdate(appUpdateInfo, updateType);
                            } else if (appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
                                Log.d("App update B", "IMMEDIATE");
                                int updateType = IMMEDIATE;
                                requestUpdate(appUpdateInfo, updateType);
                            }
                        }
                    }
                });
    

    在那个 requestUpdate() 方法之后,

    private void requestUpdate(AppUpdateInfo appUpdateInfo, int updateType) {
            try {
                appUpdateManager.startUpdateFlowForResult(appUpdateInfo, updateType, HomeActivity.this, MY_REQUEST_CODE);
            } catch (IntentSender.SendIntentException e) {
                e.printStackTrace();
            }
        }
    

    第 3 步:监听更新状态

    最后是听者

    InstallStateUpdatedListener listener = new InstallStateUpdatedListener() {
            @Override
            public void onStateUpdate(InstallState state) {
                Log.d("installState", state.toString());
                if (state.installStatus() == InstallStatus.DOWNLOADED) {
                    // After the update is downloaded, show a notification
                    // and request user confirmation to restart the app.
                    // SnackBarManager.getSnackBarManagerInstance().showSnackBar(GaanaActivity.this, "An update has just been downloaded.", true);
                    popupSnackbarForCompleteUpdate();
                }
            }
        };
    

    popupSnackbarForCompleteUpdate() 方法,

    private void popupSnackbarForCompleteUpdate() {
            Snackbar snackbar =
                    Snackbar.make(findViewById(android.R.id.content), "An update has just been downloaded.", Snackbar.LENGTH_INDEFINITE);
            snackbar.setAction("Restart", view -> appUpdateManager.completeUpdate());
            snackbar.setActionTextColor(getResources().getColor(android.R.color.white));
            snackbar.show();
        }
    

    第 4 步:获取更新状态的回调

    您也可以捕获结果,

    @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == MY_REQUEST_CODE) {
                System.out.println("App Update = " + resultCode);
                if (resultCode != RESULT_OK) {
                    System.out.println("Update flow failed! Result code: " + resultCode);
                    // If the update is cancelled or fails,
                    // you can request to start the update again.
                }
            }
        }
    

    你也必须注销监听器

    @Override
        public void onDestroy() {
            super.onDestroy();
            Log.d("installState", "destroy");
            appUpdateManager.unregisterListener(listener);
        }
    

    【讨论】:

    • 您好@mini 开发人员,我已按照所有步骤操作。请您再次检查问题。
    • 这个答案只是抄袭官方手册,没有提出任何解决方案
    【解决方案4】:

    这个答案很简单!

    我在应用更新方面遇到了很多麻烦。问题是这个库是为那些停留在同一活动中的用户创建的完全的。你可以尝试用无穷无尽的样板来修复它,但是由于调用一个与活动无关的小吃店是非常复杂的,这将花费你至少一些白发,并且给你留下可能仍然有些错误的精致代码。

    另一种选择

    我终于放弃了,决定将我的用户直接重定向到 GooglePlayStore:

    if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE ) { //maybe you could add some additional checks like priority level here
                    makeUpdateDialog(mContext).show();
    }
    

    我专门使用应用内更新库来检查可用性,然后在操作按钮中显示一个包含以下代码的对话框:

    try {
                        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(ownGooglePlayLink)));
    } catch (android.content.ActivityNotFoundException anfe) {
                        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(ownWebLink)));
    }
    
    public static final String ownGooglePlayLink="market://details?id=com.my.package.name";
    public static final String ownWebLink="https://play.google.com/store/apps/details?id=com.my.package.name";
    

    这无疑是非常 hacky,但它并不像看起来那么糟糕。我发现用户体验仍然很好,用户可以跳过您的更新或在初始化更新后返回应用程序。这样更新由谷歌直接处理,你不必照顾它。

    如果谷歌提供第二个对话框让用户决定是否要安装应用程序而不是繁琐的小吃店方法,那就太好了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多