问题描述
我最近遇到了Google Play API提供的一种新型应用程序更新流程.我喜欢这种无缝流程来更新Android应用程序.我在Hotstar应用程序中观察了以下步骤.
I recently came across a new kind of app update flow which has provided by Google Play API. I liked this seamless flow to update an Android application. I observed the below-mentioned steps in the Hotstar app.
- 可以从底部弹出显示更新的卡
- 当我单击更新Hotstar"按钮时,弹出一个对话框(似乎是Google Play提供的对话框)
- 在应用运行时在后台开始下载
- 下载完成后,会弹出一个SnackBar,显示可以安装的应用程序
- 应用程序在安装后重新启动
我该如何实现?必须有一种与Google Play交流的方式.我浏览了许多博客.但是,没有找到任何解决方案.如果用户禁用了自动应用程序更新,这对于开发人员来说可能是一个很棒的功能.
How can I achieve this? There must be a way to communicate with Google Play. I went through many blogs. But, didn't find any solution. This could be an awesome feature for a developer if the auto app update is disabled by the user.
推荐答案
步骤1:添加依赖项(build.gradle(应用程序)):
dependencies {
implementation 'com.google.android.play:core:1.7.3'
...
}
第2步:检查更新的可用性,并开始检查是否可用
private AppUpdateManager mAppUpdateManager;
private static final int RC_APP_UPDATE = 11;
在onStart()方法中:
In onStart() method:
mAppUpdateManager = AppUpdateManagerFactory.create(this);
mAppUpdateManager.registerListener(installStateUpdatedListener);
mAppUpdateManager.getAppUpdateInfo().addOnSuccessListener(appUpdateInfo -> {
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
&& appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE /*AppUpdateType.IMMEDIATE*/)){
try {
mAppUpdateManager.startUpdateFlowForResult(
appUpdateInfo, AppUpdateType.FLEXIBLE /*AppUpdateType.IMMEDIATE*/, MainActivity.this, RC_APP_UPDATE);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
} else if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED){
//CHECK THIS if AppUpdateType.FLEXIBLE, otherwise you can skip
popupSnackbarForCompleteUpdate();
} else {
Log.e(TAG, "checkForAppUpdateAvailability: something else");
}
});
第3步:收听更新状态
InstallStateUpdatedListener installStateUpdatedListener = new
InstallStateUpdatedListener() {
@Override
public void onStateUpdate(InstallState state) {
if (state.installStatus() == InstallStatus.DOWNLOADED){
//CHECK THIS if AppUpdateType.FLEXIBLE, otherwise you can skip
popupSnackbarForCompleteUpdate();
} else if (state.installStatus() == InstallStatus.INSTALLED){
if (mAppUpdateManager != null){
mAppUpdateManager.unregisterListener(installStateUpdatedListener);
}
} else {
Log.i(TAG, "InstallStateUpdatedListener: state: " + state.installStatus());
}
}
};
第4步:获取更新状态的回调
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_APP_UPDATE) {
if (resultCode != RESULT_OK) {
Log.e(TAG, "onActivityResult: app download failed");
}
}
}
第5步:灵活更新
private void popupSnackbarForCompleteUpdate() {
Snackbar snackbar =
Snackbar.make(
findViewById(R.id.coordinatorLayout_main),
"New app is ready!",
Snackbar.LENGTH_INDEFINITE);
snackbar.setAction("Install", view -> {
if (mAppUpdateManager != null){
mAppUpdateManager.completeUpdate();
}
});
snackbar.setActionTextColor(getResources().getColor(R.color.install_color));
snackbar.show();
}
第6步:别忘了注销监听器(使用onStop方法)
if (mAppUpdateManager != null) {
mAppUpdateManager.unregisterListener(installStateUpdatedListener);
}
注意:最好在MainActivity(主页)的应用程序中的任何一项活动中添加此侦听器
要进行测试,您可以使用 FakeAppUpdateManager
约束:应用内更新仅适用于运行Android 5.0(API级别21)或更高版本的设备
Constraint: In-app update works only with devices running Android 5.0 (API level 21) or higher
官方文档: https://developer.android.com/guide/app-bundle/in-app-updates
这篇关于如何使用Android的应用内更新API?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!