Intereting Posts
Как я могу позволить пользователю повторно сортировать элементы в списке? Как дублировать проект SDK-образца в рабочее пространство? MvxListView создает привязку для макета шаблона из кода Как получить объект Date в формате «YYYY-MM-DD» в android Сохранить изображение, записанное во внутреннем хранилище? Android: Поверните анимацию, верните ее в реальное состояние после окончания анимации? Как просмотреть пользовательский шрифт Android Studio (используя каллиграфию) Определите, являются ли два Java-объекта одного класса Практические показатели проектирования Android? Непредвиденная ошибка при анализе ввода недопустимого файла иерархии uiautomator Мой debug AndroidManifest.xml дает мне «не удается разрешить ошибки символов» Android OCR Library Как ссылаться на один контроль от другого во время инфляции? Как я могу заставить logcat на своем устройстве показывать журналы из всех процессов Как отключить отображение «предложений» на Soft Keyboard

Обнаруживать обновление приложения Android и установить класс приложения boolean для отображения / скрытия EULA

Я пытаюсь обнаружить, когда мое приложение было обновлено с помощью BroadcastReceiver и установить логическое значение в моем классе приложений. Это логическое значение будет использоваться в сочетании с несколькими другими логическими параметрами, чтобы определить, показывать или нет диалоговое окно EULA для пользователя.

Я верю, что все правильно настроено, но EULA все еще появляется, когда этого не должно быть. В частности, когда пользователь уже принял лицензию EULA в предыдущей версии, EULA не изменилась в обновляемой версии до (в ручном порядке меня), и приложение обновляется.

Я считаю, что причина этого не работает, потому что мое приложение не работает, поэтому метод isAppUpgrade () не вызывается и не устанавливает правильный логический флаг. Может ли кто-нибудь подтвердить, что это так, или что-то не так в моем коде?

FYI. Статический метод EULA.show (Activity, boolean, boolean) называется первым в моей основной деятельности.

Вот какой код

Класс применения

public class MFCApplication extends Application { private boolean isUpgrade = false; /** * Returns a manually set value of whether the EULA has changed in this version of the App * @return true/false */ public boolean hasEULAChanged() { return false; } /** * Returns whether or not the application has been upgraded. Set by the UpgradeBroadcastReceiver * @return true/false */ public boolean isAppUpgrade() { return isUpgrade; } /** * Method called by UpgradeBroadcastReceiver if the App has been upgraded */ public void setAppIsUpgrade() { this.isUpgrade = true; } } 

BroadcastReceiver

 public class UpgradeBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent == null) return; if (context == null) return; String action = intent.getAction(); if (action == null) return; if (action.equals(Intent.ACTION_PACKAGE_REPLACED)) { MFCApplication myApp = ((MFCApplication)((Activity)context).getApplication()); myApp.setAppIsUpgrade(); } } } 

Класс EULA

 public class EULA { private static final String EULA_ASSET = "EULA"; private static final String EULA_PREFERENCES = "eula"; private static Activity mActivity; private static PackageInfo getPackageInfo() { PackageInfo pi = null; try { pi = mActivity.getPackageManager().getPackageInfo(mActivity.getPackageName(), PackageManager.GET_ACTIVITIES); } catch (PackageManager.NameNotFoundException ex) { ex.printStackTrace(); } return pi; } public static boolean show(Activity activity, boolean hasEULAChanged, boolean isAppUpgrade) { mActivity = activity; final SharedPreferences preferences = activity.getSharedPreferences(EULA_PREFERENCES, Activity.MODE_PRIVATE); final PackageInfo packageInfo = getPackageInfo(); String eulaPref = preferences.getString(EULA_PREFERENCES, "0"); boolean eulaVersionAccepted = packageInfo.versionName.equals(eulaPref); if (!eulaVersionAccepted && (hasEULAChanged || !isAppUpgrade)) { //The EULA should be shown here, but it isn't return false; } return true; } } 

Заявка на участие

 <receiver android:name=".helpers.UpgradeBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.PACKAGE_REPLACED" /> <data android:scheme="package" android:path="com.hookedroid.fishingcompanion" /> </intent-filter> </receiver> 

Solutions Collecting From Web of "Обнаруживать обновление приложения Android и установить класс приложения boolean для отображения / скрытия EULA"

Гораздо проще просто проверить текущую версию приложения.

 PackageInfo packageInfo = activity.getPackageManager() .getPackageInfo(activity.getPackageName(), 0); int versionCode = packageInfo.versionCode; 

Когда ваше приложение запустится, вы проверите свои SharedPreferences для целочисленного значения с кодом версии. Если их нет, или если они не совпадают, отобразите EULA. После того как пользователь примет EULA, напишите значение VersionCode в SharedPreferences.

versionCode будет соответствовать номеру версии, который вы храните в манифесте.

Согласно первоначальному подходу, мне удалось определить, обновляется ли приложение, используя BroadcastReceiver

 public YourUpgradeReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Uri packageName = intent.getData(); if(packageName.toString().equals("package:" + context.getPackageName()){ //Application was upgraded } } } 

И в вашем манифесте

  <receiver android:name=".YourUpgradeReceiver"> <intent-filter> <action android:name="android.intent.action.PACKAGE_REPLACED"/> <data android:scheme="package"/> </intent-filter> </receiver> 

Обнаружение, если приложение обновлено

 SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); int versionCode = sharedPreferences.getInt("VERSION_CODE", BuildConfig.VERSION_CODE); if(versionCode != BuildConfig.VERSION_CODE) { onAppUpdated(); } sharedPreferences.edit().putInt("VERSION_CODE", BuildConfig.VERSION_CODE).apply(); 

Вот простой способ решения вашей проблемы. В вашем коде вы можете легко получить версию versionCode и versionName. В первой установке после регистрации GCM сохранить versionName в sharedPreferences. В своей домашней деятельности вы проверяете isAppUpdated (). Если текущий APP VERSION_NAME не сопоставляется с сохраненным VERSION_NAME, то перерегистрируйте GCM ID.

Вот пример кода:

Сохранить имя_пользователя в настройках:

 public static void saveVersionNameAndCode(Context context){ try{ PackageInfo packageInfo = context.getPackageManager() .getPackageInfo(context.getPackageName(), 0); int versionCode = packageInfo.versionCode; String versionName=packageInfo.versionName; CommonTasks.showLog("Saving APP VersionCode and Version Name"); // SAVE YOUR DATA }catch(Exception e){ } } 

Проверить приложение обновлено:

 public static boolean isAppUpdated(Context context){ boolean result=false; try{ PackageInfo packageInfo = context.getPackageManager() .getPackageInfo(context.getPackageName(), 0); int versionCode = packageInfo.versionCode; String versionName=packageInfo.versionName; String prevVersionName= GET STORED VERSION_NAME; if(prevVersionName!=null && !prevVersionName.equals("") && !prevVersionName.equals(versionName)){ showLog("App Updated"); result=true; }else{ showLog("App Not updated"); } }catch(Exception e){ } return result; } 

Здесь, если isAppUpdated () return true означает, что вам нужно перерегистрировать GCM ID.