AppUpdateManager.startUpdateFlowForResult не показывает диалог
Я пытаюсь реализовать обновления 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();
}
}
});
Я могу видеть успех тост и линию
appUpdateManager.startUpdateFlowForResult() is called
но это не показывает диалог обновления с кнопками No Thanks и Update, как показано на портале. Я тоже пытался использовать FakeAppUpdateManager, но это тоже не помогло.
Обращаться за помощью здесь!
4 ответа
Вот что я заметил; другими словами, ваш пробег может отличаться.
Обновление в приложении работает так, как рекламируется, но для того, чтобы оно работало так, как вы ожидаете, необходимо выполнить несколько вещей.
Вам необходимо установить тестовое приложение из Google Play; он не будет работать, если вы просто установите его из Android Studio.
Установить его из Google Play можно через «Открытое тестирование», «Закрытое тестирование» или «Внутреннее тестирование», но (я думаю) эти треки допускают только выпускные сборки (т.е. не могут устанавливать точки останова), поэтому я предлагаю вам начать с «Внутренним совместным доступом к приложению». Просто загрузите свой или на https://play.google.com/console/internal-app-sharing . Единственное, что, похоже, не работает, - это установка приоритета обновления во «Внутренний совместный доступ к приложению». Я хотел бы услышать, как другие справятся с этим.
FakeAppUpdateManager
НЕ показывает диалог обновления. Вы просто издеваетесь над тем, что будет делать Google Play, вводя такие команды, какfakeAppUpdateManager.downloadStarts()
, но диалоговых окон не будет. Обратитесь к этому .Обновление может быть как
FLEXIBLE
а такжеIMMEDIATE
в то же время. Другими словами, если вы проверитеappUpdateInfo.isUpdateTypeAllowed(FLEXIBLE)
а такжеappUpdateInfo.isUpdateTypeAllowed(IMMEDIATE)
, они могут быть обоимиtrue
. Вам решать, что делать в этот момент, в зависимости от приоритета обновления.
Вот шаги, которые я предпринял.
Установите значение 2, создайте либо
.apk
или же.aab
(в отладочной версии) и загрузите его во «Внутренний доступ к приложению». Запишите его URL-адрес загрузки.Набор
versionCode
на 1 и проделайте то же, что и в шаге 1.Откройте URL-адрес из шага 2 (т.е. версии 1) с телефона. Он откроет Google Play и попросит вас загрузить приложение. Загрузите и откройте его.
Откройте URL-адрес из шага 1 (т.е. версии 2) с телефона, но НЕ нажимайте кнопку «Обновить»; просто выведите на передний план версию приложения 1.
Пока приложение работает, подключите отладчик (Android Studio -> Run -> Attach Debugger to Android Process).
Проверить обновление (
appUpdateManager.appUpdateInfo.addOnSuccessListener {...}
) запускаем обновление (appUpdateManager.startUpdateFlowForResult(...)
), так далее.
Я столкнулся с той же проблемой. Я нашел это в документации для метода startUpdateFlowForResult в классе com.google.android.play.core.appupdate.AppUpdateManager
Каждый экземпляр {@link com.google.android.play.core.appupdate.AppUpdateInfo AppUpdateInfo} можно использовать только в одном вызове этого метода. Если вам нужно вызвать его несколько раз, например, при повторной попытке запустить поток в случае сбоя, вам нужно получить свежий {@link com.google.android.play.core.appupdate.AppUpdateInfo AppUpdateInfo} из {@link #getAppUpdateInfo()}.
Итак, получение нового экземпляра после отмены или неудачного обновления помогло
ЭТОТ ОТВЕТ - ВЗЛОМ!
У меня были проблемы с обновлениями приложений. проблема в том, что эта библиотека была создана для пользователей, которые остаются в той же деятельности, где
АЛЬТЕРНАТИВА
Я наконец сдался и решил перенаправить своих пользователей прямо в GooglePlayStore:
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE ) { //maybe you could add some additional checks like priority level here
makeUpdateDialog(mContext).show();
}
Я использую библиотеку обновлений в приложении исключительно для проверки доступности, а затем показываю диалоговое окно со следующим кодом в кнопке действия:
try {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(ownGooglePlayLink)));
} catch (android.content.ActivityNotFoundException anfe) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(ownWebLink)));
}
public static final String ownGooglePlayLink="market://details?id=com.my.package.name";
public static final String ownWebLink="https://play.google.com/store/apps/details?id=com.my.package.name";
Это, по общему мнению, очень взломано, но не так плохо, как кажется. Я считаю, что пользовательский интерфейс остается хорошим, и пользователь может либо пропустить ваше обновление, либо вернуться в приложение после инициализации обновления. таким образом обновление обрабатывается непосредственно Google, и вам не нужно о нем заботиться.
Было бы неплохо, если бы Google предоставил второй диалог, позволяющий пользователю решить, хочет ли он установить приложение, вместо утомительного подхода к закуске.
Официальная документация: https://developer.android.com/guide/app-bundle/in-app-updates
Ограничение: обновление в приложении работает только на устройствах под управлением Android 5.0 (уровень API 21) или выше
Шаг 1: Добавить зависимость:
dependencies {
implementation 'com.google.android.play:core:1.5.0'
...
}
Шаг 2. Проверьте наличие обновлений и запустите, если оно доступно
Создайте экземпляр AppUpdateManagerFactory
appUpdateManager = AppUpdateManagerFactory.create(context);
Зарегистрируйте слушателя для ответа на ГИБКИЙ запрос на обновление
appUpdateManager.registerListener(listener);
После этого получает 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);
}
}
}
});
После этого метода requestUpdate(),
private void requestUpdate(AppUpdateInfo appUpdateInfo, int updateType) {
try {
appUpdateManager.startUpdateFlowForResult(appUpdateInfo, updateType, HomeActivity.this, MY_REQUEST_CODE);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
}
Шаг 3: Слушайте, чтобы обновить состояние
Наконец слушатель
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();
}
}
};
метод 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();
}
Шаг 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.
}
}
}
Вы также должны отменить регистрацию слушателя.
@Override
public void onDestroy() {
super.onDestroy();
Log.d("installState", "destroy");
appUpdateManager.unregisterListener(listener);
}