Pedir contraseña antes de desinstalar la aplicación

En primer lugar, he investigado mucho sobre mi problema, pero no he podido encontrar una solución adecuada, así que estoy publicando mi consulta aquí. Espero obtener una mejor solución al problema:

Tengo un requisito en el que necesito pedirle una contraseña al usuario antes de que el usuario elimine mi aplicación de la configuración o de cualquier otra aplicación como MyAppSharer. Encontré una solución en la que puedo llamar mi actividad con éxito cuando el usuario hace clic en el botón Desinstalar. He aplicado el truco aquí, y llamando al servicio. En servicio, ejecuto un temporizador que se ejecuta cada 1 segundo y en ese segundo comprueba la actividad máxima de la tarea en ejecución. Esto funciona perfectamente según lo esperado.

Ahora, mi problema es que esta actividad se aplica a cada uno de los usuarios de la aplicación que intentan desinstalar. Necesito que la actividad a la que llamo, solo debería aparecer para mi aplicación cuando el usuario intente desinstalar mi aplicación.

Aquí está mi código:

public static final String PACKAGE_INSTALLER = "com.android.packageinstaller"; public static final String PACKAGE_INSTALLER_UNINSTALL_ACTIVITY = "com.android.packageinstaller.UninstallerActivity"; alarmTimer.scheduleAtFixedRate(new TimerTask() { public void run() { mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);; ComponentName topActivity = mActivityManager.getRunningTasks(1).get(0).topActivity; final String packageName = topActivity.getPackageName(); String className = topActivity.getClassName(); Log.v(TAG, "packageName:" + packageName); Log.v(TAG, "className:" + className); if (PACKAGE_INSTALLER.equals(packageName) && PACKAGE_INSTALLER_UNINSTALL_ACTIVITY.equals(className)) { //Here I need to apply one condition where package name received to be matched with my package name. But I am not sure how to fetch package name of selected application for uninstalling //To Cancel Existing UninstallerActivity and redirect user to home. Intent homeIntent = new Intent(); homeIntent.setAction(Intent.ACTION_MAIN); homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); homeIntent.addCategory(Intent.CATEGORY_HOME); startActivity(homeIntent); //To open my activity Intent loginActivity = new Intent(UninstallService.this, Act_Login.class); loginActivity.putExtra(Constants.KEY_IS_FROM_SERVICE, true); loginActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(loginActivity); } } }, 0, 1000); 

deberías probar algo como lo siguiente:

Primero: declara tu transmisión recevier en el archivo Manifiesto, que escuchará QUERY_PACKAGE_RESTART:

        

2º – su clase java UnunstallIntentReceiver como la siguiente:

 public class UninstallReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { // fetching package names from extras String[] packageNames = intent.getStringArrayExtra("android.intent.extra.PACKAGES"); if(packageNames!=null){ for(String packageName: packageNames){ if(packageName!=null && packageName.equals("application_package")){ // start your activity here and ask the user for the password } } } } } 

y por favor dame algunos comentarios

Espero que ayude.

Si se trata de un requisito corporativo (si desea impedir que un usuario normal desinstale su aplicación, no es una oportunidad, gracias a Google por protegernos de los malos desarrolladores), debe crear una aplicación de administrador de dispositivo. De esta manera, aunque el usuario aún puede eliminar la aplicación, es un paso adicional si desea evitar el borrado accidental.

Antes de eliminar su aplicación, si está habilitada como administrador del dispositivo, el usuario primero debe deshabilitar la aplicación como administrador y la aplicación recibe esta transmisión.

En tu XML, pon

             

En el receptor, tienes al menos dos métodos que vale la pena notar:

 @Override public CharSequence onDisableRequested(Context context, Intent intent) { … } @Override public void onDisabled(Context context, Intent intent) { … } 

De esta forma, sabrá que el usuario va a borrar su aplicación.

La guía completa para la administración del dispositivo se encuentra en https://developer.android.com/guide/topics/admin/device-admin.html

Si tiene permisos de raíz, haga su sistema de aplicación (elimine su archivo apk de /data en /system directorios del /system ). Luego reinicia el dispositivo. Después de reiniciar su aplicación no está disponible para eliminar por usuario (no superusuario).

La única forma que veo es proporcionar tu propio desinstalador como parte de tu aplicación (= una actividad que enumera todas las aplicaciones y permite desinstalarlas). Su servicio podría entonces verificar si su aplicación fue la que inició el instalador del paquete y, si no, redireccionar al usuario.

No es posible (al menos en Android 4.4 probé con) capturar los datos de actividad del desinstalador sin root o ser una aplicación del sistema. Esto se debe a que el desinstalador no se llama como una tarea independiente, sino como una actividad en la stack de la tarea inicial (que es la aplicación Configuración al desinstalar de la configuración, etc.). Solo puede ver los detalles de la tarea de llamada.

Sin embargo, podría haber alguna posibilidad realmente sucia, que no IThumbnailReceiver hasta el final: podría registrar la interfaz oculta IThumbnailReceiver [1] con la versión oculta de tres argumentos de ActivityManager.getRunningTasks [2]. Parece que solo se necesita el permiso GET_TASKS para tomar una miniatura (ver [3]). Debería ser posible averiguar qué aplicación se eliminará de la miniatura de la aplicación … – Pero como esta solución usa API ocultas, no hay garantía de que funcione con versiones anteriores / más recientes / con Android.

  1. https://github.com/omnirom/android_frameworks_base/blob/android-4.4/core/java/android/app/IThumbnailReceiver.aidl
  2. https://github.com/omnirom/android_frameworks_base/blob/android-4.4/core/java/android/app/ActivityManager.java#L766
  3. https://github.com/omnirom/android_frameworks_base/blob/android-4.4/services/java/com/android/server/am/ActivityManagerService.java#L6725