Detectar la actualización de la aplicación de Android y establecer la clase de aplicación booleana para mostrar / ocultar el CLUF
Estoy intentando detectar cuando mi aplicación ha sido actualizada usando un BroadcastReceiver y establecer un booleano en mi clase de aplicación. Este booleano se utilizará junto con otros pocos booleanos para determinar si se mostrará o no el cuadro de diálogo EULA al usuario.
Creo que lo tengo todo configurado correctamente, pero el EULA sigue apareciendo cuando no debería. Específicamente, cuando el usuario ya ha aceptado el EULA en una versión anterior, el EULA no ha cambiado en la versión que se está actualizando a (configurada manualmente por mí) y la aplicación se está actualizando.
- BroadcastReceiver no funciona correctamente a menos que se registre manualmente
- ¿Cómo identifica * qué * dispositivo bluetooth causa una emisión ACTION_ACL_CONNECTED?
- ¿Cómo puedo interceptar pulsaciones de botón en el auricular en Android?
- Android BroadcastReceiver onReceive () llamado dos veces en android 4.0
- Problema con BroadcastReceiver (error del receptor no registrado)
Creo que la razón por la que esto no funciona es porque mi aplicación no se está ejecutando y por lo tanto el método isAppUpgrade () no se está llamando y estableciendo el indicador booleano correcto. ¿Puede alguien confirmar esto es el caso, o hay algo mal en mi código?
FYI – El método estático EULA.show (Activity, boolean, boolean) está siendo llamado primero en mi actividad principal.
Aquí hay un código
Clase de aplicación
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; } }
Receptor de radiodifusión
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(); } } }
Clase 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; } }
Manifiesto de la aplicación
<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>
- ¿Cómo detectar cuando el usuario activa / desactiva el estado del GPS?
- ¿Por qué llamar a setResult en BroadcastReceiver?
- Cómo obtener la forma de actividad BroadcastReceiver en onReceive
- El receptor de la difusión para comprobar la conexión a internet se llama dos veces cuando desconecto el wifi
- BroadcastReceiver no recibe la acción completa de descarga
- Detectar la desconexión desde un punto de acceso WiFi
- Android: ¿Cómo puedo abortar / eliminar completamente la emisión pegajosa?
- BroadcastReceiver onReceive activado cuando se registra
Es mucho más fácil verificar la versión actual de tu aplicación.
PackageInfo packageInfo = activity.getPackageManager() .getPackageInfo(activity.getPackageName(), 0); int versionCode = packageInfo.versionCode;
Cuando se inicia la aplicación, comprueba las SharedPreferences para obtener un valor entero con el código de versión. Si no hay ninguno, o si no coincide, muestre el EULA. Después de que el usuario acepte el EULA, escriba el valor versionCode en SharedPreferences.
versionCode
coincidirá con el número de versión que almacena en el manifiesto.
De acuerdo con el enfoque original, lo he logrado para detectar si la aplicación se actualiza mediante 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 } } }
Y en tu Manifiesto
<receiver android:name=".YourUpgradeReceiver"> <intent-filter> <action android:name="android.intent.action.PACKAGE_REPLACED"/> <data android:scheme="package"/> </intent-filter> </receiver>
Detectar si la aplicación se ha actualizado
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();
Aquí está una manera simple que puede solucionar su problema. En tu código puedes obtener fácilmente la versión de la aplicación versionCode y versionName. En la primera instalación después del registro GCM, guarde el nombre de versión en sharedPreferences. En su actividad en el hogar, consulte isAppUpdated (). Si la APP actual VERSION_NAME no coincide con VERSION_NAME almacenada, vuelva a registrar el ID de GCM.
Aquí está el ejemplo de código:
Guardar nombre de versión en las preferencias:
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){ } }
Comprobar la aplicación se actualiza:
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; }
Aquí, si isAppUpdated () devuelve true significa que tiene que volver a registrar GCM ID.
- Intercambio de datos entre fragmentos y actividad en Android
- Vista de lista de Android con el problema de la casilla de verificación