#java #android #google-play
#java #Android #google-play
Вопрос:
Я хочу немедленно обновлять свое приложение каждый раз, когда публикую обновление. Я следовал инструкциям из официальной документации Android о том, как протестировать функцию автоматического обновления, но ничего не происходит. Я разместил несколько журналов, чтобы проверить, инициализируются ли эти функции, но logcat также ничего не показывает. Это проблема в моем синтаксисе, или я должен разместить эти функции где-то еще? В настоящее время весь мой код обновления написан внутри основного, начального класса приложения.
В методе create класса
private static final int REQUEST_APP_UPDATE = 560;
private AppUpdateManager appUpdateManager;
private InstallStateUpdatedListener installStateUpdatedListener;
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
appUpdateManager = AppUpdateManagerFactory.create(this);
installStateUpdatedListener = new
InstallStateUpdatedListener() {
@Override
public void onStateUpdate(InstallState state) {
if (state.installStatus() == InstallStatus.DOWNLOADED){
} else if (state.installStatus() == InstallStatus.INSTALLED){
if (appUpdateManager != null){
appUpdateManager.unregisterListener(installStateUpdatedListener);
}
} else {
Log.i(TAG, "InstallStateUpdatedListener: state: " state.installStatus());
}
}
};
appUpdateManager
.getAppUpdateInfo()
.addOnSuccessListener(
appUpdateInfo -> {
Log.d("TAG", "here");
// Checks that the platform will allow the specified type of update.
if ((appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE)
amp;amp; appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE))
{
// Request the update.
try {
Log.d("TAG", "here");
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
AppUpdateType.IMMEDIATE,
this,
REQUEST_APP_UPDATE);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
}
});
appUpdateManager.registerListener(installStateUpdatedListener);
...
При возобновлении и при остановке методов обработки:
@Override
protected void onResume() {
super.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 {
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
AppUpdateType.IMMEDIATE,
this,
REQUEST_APP_UPDATE);
Log.d("TAG", "tu");
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
}
});
}
@Override
protected void onStop() {
super.onStop();
if (appUpdateManager != null) {
appUpdateManager.unregisterListener(installStateUpdatedListener);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_APP_UPDATE) {
if (resultCode != RESULT_OK) {
Log.d("TAG", "Update flow failed! Result code: " resultCode);
// If the update is cancelled or fails,
// you can request to start the update again.
}
}
}
Комментарии:
1. Используете ли вы внутреннюю дорожку для публикации?
2. Да, все обновления, которые я тестировал, были внутренними обновлениями.
Ответ №1:
Я предлагаю вам переместить все ваши AppUpdateInfo
извлечения в onResume()
, поскольку это более надежная точка входа в действие (например, если действие перешло в фоновый режим, а затем было снова открыто пользователем). Метод onCreate будет вызван, только если действие было уничтожено, поскольку после повторного открытия приложения вы можете не увидеть диалоговое окно обновления, если оно было свернуто.
@Override
public void onResume() {
super.onResume();
appUpdateManager.getAppUpdateInfo().addOnSuccessListener( info -> {
boolean isStalledUpdate = info.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS;
boolean isReadyForUpdate =
info.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
amp;amp; info.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE;
if (isReadyForUpdate || isStalledUpdate) {
appUpdateManager.startUpdateFlowForResult(
info,
AppUpdateType.IMMEDIATE,
this,
REQ_CODE
);
}
}
Иногда приложение не синхронизируется автоматически с обновлениями Play Store, поэтому вам необходимо выполнить следующее:
Убедитесь, что у вас есть обновление, доступное вручную — зайдите в Play Store, проверьте наличие обновлений и убедитесь, что у вас есть обновление, доступное для вашего приложения. После этого откройте ваше приложение (ваше действие, вызывающее диспетчер обновлений в onResume
), и вы увидите диалоговое окно немедленного обновления.
Кроме того, один совет для вас — заставьте вашу активность реализовать InstallStateUpdateListener и переопределить метод onStateUpdate
, подобный этому, для обработки разных событий.
@Override
public void onResume() {
// All previous logic
// If update is available or was stalled call this
appUpdateManager.registerListener(this);
}
@Override
public void onStateUpdate(InstallState state) {
if (state == null) return;
switch (state.installStatus()) {
case InstallStatus.INSTALLED:
appUpdateManager.unregisterListener(this)
return;
case InstallStatus.FAILED:
appUpdateManager.unregisterListener(this)
return;
case InstallStatus.CANCELED:
appUpdateManager.unregisterListener(this)
return;
default:
// provide your own logic
return;
}
}
Это поможет вам избежать вызова отдельного экземпляра listener в методах жизненного цикла activity.
Комментарии:
1. Я переместил код в onResume, обновил проект в консоли Google Play, вручную искал обновления на своем устройстве, протестировал его, и, похоже, он по-прежнему не работает, ничего не происходит.
2. @Xarxes вы должны убедиться, что вы находитесь на внутреннем треке и обновление доступно в play Store. Вы видите сообщение, подобное этому, на скриншоте? i.stack.imgur.com/AZ142.jpg
3. мое обновление доступно для загрузки в Play Store, я не обновляю его, после проверки, возможно ли обновление, я направляюсь прямо к своему приложению, но ничего не происходит. У меня есть сообщение, предупреждающее меня о внутреннем тестировании.
4. @Xarxes это довольно интересно. Вы зарегистрировали onsucclistener информации об обновлении вашего приложения? Вызывается ли код при условии доступности обновления?
5. Мои журналы: AppUpdateService: requestUpdateInfo («имя приложения») AppUpdateService : инициирует привязку к сервису. AppUpdateListenerRegistry : registerListener AppUpdateService: requestUpdateInfo(com.sunfamily.bonus) AppUpdateListenerRegistry : registerListener AppUpdateService : ожидает привязки к сервису. AppUpdateService: ServiceConnectionImpl.onServiceConnected(ComponentInfo{com.android.vending/com.google.android.finsky.installservice. DevTriggeredUpdateService}) AppUpdateService: linkToDeath OnRequestInstallCallback: onRequestInfo AppUpdateService: отвязаться от службы.
Ответ №2:
Код, который я предоставил, работал, проблема отсутствия обновления заключалась в том, что само устройство не знало, доступно ли обновление. После обновления списка обновлений в Play Store диспетчер обновлений приложений инициализировал окно автоматического обновления при запуске приложения.
Комментарии:
1. Магазин Google Play показывает, что доступно обновление, но inAppUpdate, похоже, не распознает его. Есть идеи?