我正在尝试使用AppUpdateManager实施Android In App Update API。我首先尝试按照文档进行操作,如果您在这里,那么您知道那是行不通的。
因此,我读了十几本有关如何使其工作的教程和博客文章。我在那里大约有90%。对于我来说,在用户接受更新之后,下载了更新,我的听众检测到下载已完成,并且我显示了自己的消息并回电了(大多数教程此时都使用了Toast,但是这不应该物)。如果我的用户点击“重新启动”(这是我在显示的消息的“确定”侧添加的标签),则我将调用appUpdateManager.completeUpdate()。
这时,我从Google Play中获得一个屏幕,其中显示了一些漂亮的动画,并显示了一个安装进度栏,安装完成后,Google屏幕消失了,然后重新启动了我的应用。
问题是没有安装,我可以从我的应用程序版本中得知它仍然是先前版本,并且由于它仍然是先前版本,因此会重新创建appUpdateManager并在检查UpdateAvailability.UPDATE_AVAILABLE时,它会(显然)发现有可用的更新,然后返回整个过程,再次下载并尝试重新启动应用。
我添加了一些日志消息,并检查是否在onActivityResult中得到了RESULT_IN_APP_UPDATE_FAILED,但一切正常。
任何人的任何帮助或建议都很好。
我在MainActivity的开头创建了appUpdateManager的句柄,如下所示:
private AppUpdateManager appUpdateManager;
在创建FLEXABLE AppUpdateType时,我还创建了一个监听器来监视安装状态,
private InstallStateUpdatedListener UPDATE_LISTENER = installState -> {
if (installState.installStatus() == DOWNLOADED) {
Log.d(TAG, "~UPDATE_LISTENER - installStatus is DOWNLOADED");
Utility.displayAlert(UPDATE_READY);
}
Log.d(TAG, "~Error code is: " + installState.installErrorCode());
Log.d(TAG, "~Package name is: " + installState.packageName());
};
在我的onCreate中,我创建了appUpdateManager并注册了下载侦听器,并添加了addOnSuccessListener,如下所示:
Log.d(TAG, "~updateAppIfAvailable");
// Creates instance of the manager.
appUpdateManager = AppUpdateManagerFactory.create(this);
Log.d(TAG, "~registerListener");
appUpdateManager.registerListener(UPDATE_LISTENER);
appUpdateManager
.getAppUpdateInfo()
.addOnSuccessListener(
appUpdateInfo -> {
// Checks that the platform will allow the specified type of update.
Log.d(TAG, "~updateAvailability is " + appUpdateInfo.updateAvailability());
if ((appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE)
&& appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
// Request the update.
try {
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
AppUpdateType.FLEXIBLE,
this,
MY_REQUEST_CODE);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
}
});
我的onActivityResult看起来像这样: @Override 受保护的void onActivityResult(int requestCode,int resultCode,@Nullable Intent数据){ super.onActivityResult(requestCode,resultCode,data); Log.d(TAG,“〜onActivityResult”); 如果(requestCode == MY_REQUEST_CODE){ 开关(resultCode){ 案例Activity.RESULT_OK: Log.d(TAG,“〜用户批准的更新”); 打破; 案例Activity.RESULT_CANCELED: Log.d(TAG,“〜用户拒绝更新”); 打破; 情况RESULT_IN_APP_UPDATE_FAILED: Log.d(TAG,“〜更新失败”); 打破; } } }
onResume是:
appUpdateManager
.getAppUpdateInfo()
.addOnSuccessListener(
appUpdateInfo -> {
if (appUpdateInfo.updateAvailability()
== UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {
// If an in-app update is already running, resume the update.
try {
Log.d(TAG, "~onResume appUpdateManager is calling startUpdateFlowForResult");
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
AppUpdateType.FLEXIBLE,
this,
MY_REQUEST_CODE);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
}
});
最后,当我显示警报时(如果需要,可以是Toast),同时具有“取消”和“重新启动”选项,并显示一条消息,提示“更新下载已完成。”
如果用户按下“重新启动”选项,则它将调用此updateAndRestart()方法:
private void updateAndRestart() {
Log.d(TAG, "~updateAndRestart");
Log.d(TAG, "~Completing app update.");
if (appUpdateManager != null) {
appUpdateManager.completeUpdate();
Log.d(TAG, "~unregisterListener");
appUpdateManager.unregisterListener(UPDATE_LISTENER);
}
}
答案 0 :(得分:0)
好了,已经过去了一周,显然我已经困扰了整个SO社区。 :)不过,认真地说,过去一周我一直在阅读Android文档和教程,但没有其他答案,所以我只想说Google Update API尚未准备好投入生产。
我找到了替代解决方案。它是
的组合Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.example.android")); intent.setPackage("com.android.vending"); startActivity(intent);