¿Cómo evito que Android tome una captura de pantalla cuando mi aplicación pasa a segundo plano?
La aplicación que estoy creando actualmente tiene el requisito de que debe evitar que el sistema operativo tome una captura de pantalla de la aplicación cuando se coloca en segundo plano por razones de seguridad. De esta manera 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 necesito descubrir cómo puedo lograr esta funcionalidad.
Entonces, ¿hay alguien por ahí que tenga idea de cómo solucionar este problema?
Intentar 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 automáticas del historial de tareas recientes de ICS. También protege contra la grabación de pantalla (por ejemplo, aplicaciones que utilizan las API de proyección de medios).
ACTUALIZACIÓN : también protege contra Now On Tap u otros asistentes en Android 6.0; no tendrán acceso a los detalles de los widgets y contenedores en su interfaz de usuario 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 la barra de acciones, etc.) será insegura. Puede solucionar el Dialog
problema llamándolo getWindow()
y configurando FLAG_SECURE
. El resto... se vuelve complicado. Consulte esta publicación de blog para obtener más información.
Tenga cuidado al usar WindowManager.LayoutParams.FLAG_SECURE, en algunos dispositivos (verificado en Samsung Galaxy ACE, por ejemplo, GT-S5830) esto hará que la vista se confunda. 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:
Sin embargo, esto funciona correctamente en los teléfonos ICS Samsung, por lo que supongo que el problema está aislado en los dispositivos Gingerbread (o anteriores).
La solución aportada por CommonsWare sigue siendo válida también en Lollipop.
Solo una nota: si desea seguir sin ver instantáneas en la lista reciente de toda la aplicación, TODAS las actividades implementadas deben especificar en el onCreate()
método la marca getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
anterior.setContentView();
De lo contrario, una instantánea en la lista reciente mostrará la primera actividad sin la bandera si el usuario navegó por ella.