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但这也没有帮助。
在此请求帮助!
这是我注意到的;换句话说,您的里程可能会有所不同。
应用程序内更新的工作原理与广告中所宣传的一样,但为了使其按照您期望的方式工作,需要做好一些准备工作。
您需要从 Google Play 安装您的测试应用程序;如果您只是从 Android Studio 安装它,它将无法工作。
从 Google Play 安装它可以通过“开放测试”、“封闭测试”或“内部测试”来完成,但是(我认为)这些轨道只允许发布版本(即无法设置断点),所以我建议你开始与“内部应用程序共享”。.apk只需将您的或上传.aab到https://play.google.com/console/internal-app-sharing。唯一似乎不起作用的是在“内部应用程序共享”中设置更新优先级。我想听听其他人是如何处理的。
FakeAppUpdateManager不显示更新对话框。您只需通过发出命令(例如 )来模拟 Google Play 会执行的操作,fakeAppUpdateManager.downloadStarts()但不会出现任何对话框。参考这个。
更新可以FLEXIBLE同时进行IMMEDIATE。换句话说,如果您检查appUpdateInfo.isUpdateTypeAllowed(FLEXIBLE)和appUpdateInfo.isUpdateTypeAllowed(IMMEDIATE),它们可以都是true。您可以根据更新的优先级来决定此时要做什么。
这些是我采取的步骤。
设置versionCode为 2,构建.apk或.aab(在调试版本中),并将其上传到“内部应用程序共享”。记下其下载 URL。
设置versionCode为1,并执行与步骤1相同的操作。
从手机中打开步骤 2 中的 URL(即版本 1)。它将打开 Google Play 并要求您下载该应用程序。下载并打开它。
从手机上打开步骤 1 中的 URL(即版本 2),但不要点击“更新”按钮;只需将应用程序版本 1 带到前台即可。
当应用程序运行时,附加调试器(Android Studio -> 运行 -> 将调试器附加到 Android 进程)。
检查更新 ( appUpdateManager.appUpdateInfo.addOnSuccessListener {...})、开始更新 ( appUpdateManager.startUpdateFlowForResult(...)) 等。
如果所有测试步骤看起来都太复杂,您可能想尝试以下操作。
versionCode使用to 2创建发布版本。
将其上传到“内部测试”,而不是“内部应用程序共享”。
在Android Studio中设置versionCode为1并开始测试。
(可选)完成测试后,暂停“内部测试”轨道。
小智 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()}。
因此,在更新取消或失败后获取新实例就可以了
官方文档: 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)
| 归档时间: |
|
| 查看次数: |
12066 次 |
| 最近记录: |