[英]is there a support in-app updates android example in java
我发现这篇文章解决了这个问题,以明确我将编写class代码并记住有两种方法可以实现应用内更新:立即和灵活。
1 实施 'com.google.android.play:core:1.10.3'
2.1 如果您将使用灵活的方法,请将 class 名称替换为您的示例“MainActivity”
public class Flexible extends AppCompatActivity {
private AppUpdateManager appUpdateManager;
private InstallStateUpdatedListener installStateUpdatedListener;
private static final int FLEXIBLE_APP_UPDATE_REQ_CODE = 123;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_update_f);
appUpdateManager = AppUpdateManagerFactory.create(getApplicationContext());
installStateUpdatedListener = state -> {
if (state.installStatus() == InstallStatus.DOWNLOADED) {
popupSnackBarForCompleteUpdate();
} else if (state.installStatus() == InstallStatus.INSTALLED) {
removeInstallStateUpdateListener();
} else {
Toast.makeText(getApplicationContext(), "InstallStateUpdatedListener: state: " + state.installStatus(), Toast.LENGTH_LONG).show();
}
};
appUpdateManager.registerListener(installStateUpdatedListener);
checkUpdate();
}
private void checkUpdate() {
Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();
appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
&& appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
startUpdateFlow(appUpdateInfo);
} else if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED) {
popupSnackBarForCompleteUpdate();
}
});
}
private void startUpdateFlow(AppUpdateInfo appUpdateInfo) {
try {
appUpdateManager.startUpdateFlowForResult(appUpdateInfo, AppUpdateType.FLEXIBLE, this, Flexible.FLEXIBLE_APP_UPDATE_REQ_CODE);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == FLEXIBLE_APP_UPDATE_REQ_CODE) {
if (resultCode == RESULT_CANCELED) {
Toast.makeText(getApplicationContext(), "Update canceled by user! Result Code: " + resultCode, Toast.LENGTH_LONG).show();
} else if (resultCode == RESULT_OK) {
Toast.makeText(getApplicationContext(),"Update success! Result Code: " + resultCode, Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(), "Update Failed! Result Code: " + resultCode, Toast.LENGTH_LONG).show();
checkUpdate();
}
}
}
private void popupSnackBarForCompleteUpdate() {
Snackbar.make(findViewById(android.R.id.content).getRootView(), "New app is ready!", Snackbar.LENGTH_INDEFINITE)
.setAction("Install", view -> {
if (appUpdateManager != null) {
appUpdateManager.completeUpdate();
}
})
.setActionTextColor(getResources().getColor(R.color.purple_500))
.show();
}
private void removeInstallStateUpdateListener() {
if (appUpdateManager != null) {
appUpdateManager.unregisterListener(installStateUpdatedListener);
}
}
@Override
protected void onStop() {
super.onStop();
removeInstallStateUpdateListener();
}}
2.1 如果您将使用即时方法,请将 class 名称替换为您的示例“MainActivity”
public class Immediate extends AppCompatActivity {
private AppUpdateManager appUpdateManager;
private static final int IMMEDIATE_APP_UPDATE_REQ_CODE = 124;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_update_f);
appUpdateManager = AppUpdateManagerFactory.create(getApplicationContext());
checkUpdate();
}
private void checkUpdate() {
Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();
appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
&& appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
startUpdateFlow(appUpdateInfo);
} else if (appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS){
startUpdateFlow(appUpdateInfo);
}
});
}
private void startUpdateFlow(AppUpdateInfo appUpdateInfo) {
try {
appUpdateManager.startUpdateFlowForResult(appUpdateInfo, AppUpdateType.IMMEDIATE, this, Immediate.IMMEDIATE_APP_UPDATE_REQ_CODE);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == IMMEDIATE_APP_UPDATE_REQ_CODE) {
if (resultCode == RESULT_CANCELED) {
Toast.makeText(getApplicationContext(), "Update canceled by user! Result Code: " + resultCode, Toast.LENGTH_LONG).show();
} else if (resultCode == RESULT_OK) {
Toast.makeText(getApplicationContext(), "Update success! Result Code: " + resultCode, Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(), "Update Failed! Result Code: " + resultCode, Toast.LENGTH_LONG).show();
checkUpdate();
}
}
}}
3 如何测试? 请按照所有步骤
3.1 生成签名的应用包/APK。 请注意,APK 签名密钥和 applicationId 应与已发布的应用程序相同。
3.2 与测试人员共享生成的 APK。 为此,select 在 Google 控制台中发布的应用程序,导航到Internal App Sharing ,然后将生成的 APK 上传到那里。 查看如何使用Google Internal App Sharing 。
3.3 复制上传的共享链接并与测试人员共享。 在这种情况下,测试人员应该有一个 Android 手机。
3.4 在手机浏览器上打开共享链接。 您将被重定向到 Play 商店。
3.5 下载应用程序并等待安装完成。
3.6 完成后,生成另一个签名的 app bundle/APK。 这次将 app.gradle 文件中的 versionCode 和 versionName 更改为更高版本
3.7 生成 app bundle/APK 后,前往 App Internal Sharing 并上传。
3.8 再次,复制此上传生成的可共享链接,并用测试人员打开。 当链接在 Google Play 商店启动时,您会看到一个更新按钮,不要点击更新。
3.9 关闭 Google Play 商店并打开我们之前安装的应用程序。 这将启动一个更新 UI,提示您更新应用程序。 UI 可能会根据您的更新类型(灵活或即时)而有所不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.