¿Cómo evito que Android tome una captura de pantalla cuando mi aplicación va al fondo?

La aplicación que estoy construyendo actualmente tiene el requisito de que la aplicación tiene que impedir que el sistema operativo tome una captura de pantalla de la aplicación cuando se está introduciendo en segundo plano por razones de seguridad. De esta forma, no podrá ver la última pantalla activa al cambiar entre aplicaciones.

Estoy planeando poner esta funcionalidad en el método onPause de la clase de aplicación, pero primero tengo que averiguar cómo puedo lograr esta funcionalidad.

Así que hay alguien por ahí, que tiene una pista de cómo arreglar esto?

Prueba FLAG_SECURE :

 public class FlagSecureTestActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); setContentView(R.layout.main); } } 

Esto definitivamente se asegura contra capturas de pantalla manuales y capturas de pantalla automáticas de la historia de tareas recientes de ICS.

UPDATE : también protege contra Now On Tap u otros asistentes en Android 6.0; No obtendrán acceso a los detalles de widgets y contenedores en su interfaz de usuario si el usuario muestra el asistente.

UPDATE # 2 : sin embargo, no todo en la actividad estará protegido. Cualquier ventana emergente – Dialog , Spinner , AutoCompleteTextView , desbordamiento de la barra de acción, etc. – será insegura. Puede solucionar el problema del getWindow() Dialog llamando a getWindow() en él y estableciendo FLAG_SECURE . El resto … se pone complicado. Vea esta entrada del blog para más información.

Tenga cuidado con el uso de WindowManager.LayoutParams.FLAG_SECURE, en algunos dispositivos (verificados en Samsung Galaxy ACE, por ejemplo GT-S5830) esto hará que la vista codificada. Parece un bicho específico de Samsung. Recomiendo lo siguiente:

 if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) { getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); } 

Esto es lo que parece una pantalla revuelta:

Imagen de pantalla revuelta

Esto está funcionando correctamente en los teléfonos de ICS Samsung sin embargo, así que estoy asumiendo que el problema es aislado a los dispositivos del pan de jengibre (o más viejos).

La solución proporcionada por CommonsWare sigue siendo válida también en Lollipop.

Solo una nota, si quieres seguir sin ver las instantáneas en la lista reciente de toda la aplicación, TODAS las actividades implementadas deben especificar en el método onCreate() el indicador getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); Antes de setContentView();

De lo contrario, una instantánea en la lista reciente mostrará la primera actividad sin el indicador si el usuario lo navega.

  • Autenticación de Microsoft ISA Server en Android
  • ¿Cómo verificar la aplicación instalada en tiempo de ejecución para evitar el ataque de phishing?
  • "Flujo no representa una tienda de claves PKCS12" después de almacenar con una nueva contraseña en el dispositivo Android
  • Android.security.KeyStoreException: Bloc de clave no válido
  • Implementación insegura de la interfaz X509TrustManager - Servicios de Google Play
  • Almacenamiento de clave secreta en KeyStore sin el parámetro ProtectionParameter
  • ¿Cómo mantener seguro el secreto del consumidor de OAuth y cómo reaccionar cuando está comprometido?
  • Biblioteca a recursos de cifrado y descifrado
  • ¿Es seguro que almacena información de tarjeta creadit en android?
  • El exponente privado de Android KeyStore no se puede extraer
  • ¿Cómo almacenar de forma segura el token de acceso y el secreto en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.