AppUpdateManager.startUpdateFlowForResult 不显示对话框

Var*_*A M 8 android android-intent in-app-update

我正在尝试实现android 应用内更新。我正在按照官方门户中提供的教程进行操作,但调用 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();
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

我能够看到成功祝酒词和线条

appUpdateManager.startUpdateFlowForResult() is called
Run Code Online (Sandbox Code Playgroud)

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

在此请求帮助!

sol*_*our 8

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

应用程序内更新的工作原理与广告中所宣传的一样,但为了使其按照您期望的方式工作,需要做好一些准备工作。

  1. 您需要从 Google Play 安装您的测试应用程序;如果您只是从 Android Studio 安装它,它将无法工作。

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

  3. FakeAppUpdateManager不显示更新对话框。您只需通过发出命令(例如 )来模拟 Google Play 会执行的操作,fakeAppUpdateManager.downloadStarts()但不会出现任何对话框。参考这个

  4. 更新可以FLEXIBLE同时进行IMMEDIATE。换句话说,如果您检查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(...)) 等。


如果所有测试步骤看起来都太复杂,您可能想尝试以下操作。

  1. versionCode使用to 2创建发布版本。

  2. 将其上传到“内部测试”,而不是“内部应用程序共享”。

  3. 在Android Studio中设置versionCode为1并开始测试。

  4. (可选)完成测试后,暂停“内部测试”轨道。


小智 5

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

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

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


min*_*per 1

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

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

步骤一: 添加依赖:

dependencies {

    implementation 'com.google.android.play:core:1.5.0'
    ...
}
Run Code Online (Sandbox Code Playgroud)

步骤 2:检查更新可用性,如果可用则启动

创建 AppUpdateManagerFactory 的实例

 appUpdateManager = AppUpdateManagerFactory.create(context);
Run Code Online (Sandbox Code Playgroud)

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

        appUpdateManager.registerListener(listener);
Run Code Online (Sandbox Code Playgroud)

之后获取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);
                        }
                    }
                }
            });
Run Code Online (Sandbox Code Playgroud)

在 requestUpdate() 方法之后,

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

第三步:监听更新状态

最后是听者

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();
            }
        }
    };
Run Code Online (Sandbox Code Playgroud)

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();
    }
Run Code Online (Sandbox Code Playgroud)

第 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.
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

您还必须取消注册侦听器

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

  • 本回答只是抄袭官方手册,并没有提出任何解决方案 (5认同)