¿Cómo evito que Android tome una captura de pantalla cuando mi aplicación se queda en segundo plano?

La aplicación que estoy desarrollando tiene el requisito de que la aplicación debe evitar que el sistema operativo tome una captura de pantalla de la aplicación cuando se la empuja hacia el fondo por razones de seguridad. De esta forma, no podrá ver la última pantalla activa al cambiar de una aplicación a otra.

Planeo poner esta funcionalidad en el método onPause de la clase de aplicación, pero primero necesito descubrir cómo puedo lograr esta funcionalidad.

Entonces, ¿hay alguien por ahí que tenga una pista de cómo solucionar esto?

Pruebe FLAG_SECURE :

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

Esto definitivamente protege contra capturas de pantalla manuales y capturas de pantalla automáticas de la historia de tareas recientes de ICS. También protege contra la grabación de pantalla (por ejemplo, aplicaciones que usan las API de proyección de medios).

ACTUALIZACIÓN : también se protege contra Now On Tap u otros asistentes en Android 6.0; no tendrán acceso a los detalles de widgets y contenedores en su UI si el usuario abre el asistente.

ACTUALIZACIÓN # 2 : sin embargo, no todo en la actividad estará protegido. Cualquier ventana emergente – Dialog , Spinner , AutoCompleteTextView , desbordamiento de barras de acción, etc. – será insegura. Puede solucionar el problema del Dialog llamando a getWindow() y configurando FLAG_SECURE . El rest … se vuelve complicado. Vea esta publicación en el blog para más.

Tenga cuidado con el uso de WindowManager.LayoutParams.FLAG_SECURE, en algunos dispositivos (verificado en Samsung Galaxy ACE, p. Ej. GT-S5830), esto hará que la vista esté codificada. Parece un error 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); } 

Así es como se ve una pantalla codificada:

Imagen de pantalla codificada

Sin embargo, esto está funcionando correctamente en los teléfonos ICS Samsung, así que supongo que el problema está aislado de los dispositivos Gingerbread (o anteriores).

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

Solo una nota, si desea continuar sin ver 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 la bandera si el usuario navegó a través de ella.