Solicitar contraseña antes de desinstalar la aplicación

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

Tengo un requisito donde necesito pedir la contraseña al usuario antes de que el usuario elimine mi app de ajustes o de cualquier otra aplicación como MyAppSharer. He encontrado una solución donde puedo con éxito poder llamar mi actividad cuando el usuario hace clic en el botón Desinstalar. He aplicado truco aquí, y llamar al servicio. En servicio, ejecuto el contador de tiempo que funciona cada 1 segundo y en ese segundo, él comprueba para arriba la mayoría de la actividad de la tarea corriente. Esto está funcionando perfectamente según lo esperado.

Ahora, mi problema es, esta actividad apppears en cada uno de los usuarios de aplicaciones intenta desinstalar. Necesito que la actividad que yo llamo, sólo debe aparecer para mi aplicación cuando el usuario intenta 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); 

Usted debe intentar algo como el siguiente:

1º – declare su recevier de difusión en el archivo Manifest, que escuchará QUERY_PACKAGE_RESTART:

  <receiver android:name=".UninstallReceiver"> <intent-filter android:priority="999999"> <action android:name="android.intent.action.QUERY_PACKAGE_RESTART" /> <data android:scheme="package" /> </intent-filter> </receiver> 

2 º – su UnunstallIntentReceiver java clase 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 déme algunos comentarios

Espero que ayude.

Si se trata de un requisito corporativo (si desea bloquear a un usuario habitual de desinstalar su aplicación, no hay ninguna posibilidad, gracias a Google por protegernos de los desarrolladores incorrectos), debe crear una aplicación de administrador de dispositivos. De esta manera, aunque el usuario todavía puede eliminar la aplicación, es un paso extra si desea evitar el borrado accidental.

Antes de eliminar la aplicación, si está habilitada como administrador de dispositivos, el usuario debe desactivar primero la aplicación como administrador y la aplicación recibe esta difusión.

En su XML, poner

 <activity android:name=".app.DeviceAdminSample" android:label="@string/activity_sample_device_admin"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.SAMPLE_CODE" /> </intent-filter> </activity> <receiver android:name=".app.DeviceAdminSample$DeviceAdminSampleReceiver" android:label="@string/sample_device_admin" android:description="@string/sample_device_admin_description" android:permission="android.permission.BIND_DEVICE_ADMIN"> <meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin_sample" /> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> </intent-filter> </receiver> 

En el receptor, usted tiene por lo 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 manera usted sabe que el usuario potencialmente 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 root, haga su sistema de aplicaciones (elimine su archivo apk de /data a /system directorios del /system ). A continuación, reinicie el dispositivo. Después de reiniciar su aplicación no está disponible para eliminar por el usuario (no superusuario).

La única manera que veo, es proporcionar tu propio desinstalador como parte de tu aplicación (= una actividad que muestra todas las aplicaciones y permite desinstalarlas). Su servicio podría comprobar si su aplicación era la que inició el paquete y si no redirigir al usuario.

No es posible (al menos en el Android 4.4 he probado con) para tomar los datos de la actividad de 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 pila de la tarea de inicio (que es la aplicación Configuración cuando se desinstala de la configuración, etc.). Sólo puede ver los detalles de la tarea que llama.

Sin embargo, podría haber alguna posibilidad realmente sucia izquierda, que no probar hasta el final: Usted podría registrar la interfaz oculta IThumbnailReceiver [1] con la versión de tres argumentos ocultos de ActivityManager.getRunningTasks [2]. Parece que sólo se necesita el permiso de GET_TASKS para tomar una miniatura (ver [3]). Debería ser posible averiguar qué aplicación se va a eliminar de la miniatura de la aplicación … – Pero como esta solución utiliza APIs ocultas, no hay garantía de que funcionará con las versiones de Android más antiguas / más nuevas / vendidas.

  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
  • No se pudo encontrar la clase SoapObject
  • ¿Cómo implementar callbacks usando IntentService en Android?
  • StopService no deja de ser mi servicio ... ¿por qué?
  • Startservice no funciona en Android
  • El servicio de Android se detiene al salir de la aplicación
  • Cómo mantener un servicio de Intent funcionando
  • ¿Cómo detener el servicio de otra actividad en Android?
  • Paradas de servicio de Android
  • Android - bindService más de una vez
  • No se puede iniciar la intención del servicio
  • Android "cerrar la fuerza" lo que exactamente sucede con la memoria
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.