¿Cómo evito que Android tome una captura de pantalla cuando mi aplicación pasa a segundo plano?

Resuelto StingRay5 asked hace 54 años • 8 respuestas

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?

StingRay5 avatar Jan 01 '70 08:01 StingRay5
Aceptado

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 Dialogproblema llamándolo getWindow()y configurando FLAG_SECURE. El resto... se vuelve complicado. Consulte esta publicación de blog para obtener más información.

CommonsWare avatar Mar 22 '2012 12:03 CommonsWare

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:

Imagen de 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).

gardarh avatar Jun 20 '2012 14:06 gardarh

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.

Davideas avatar Mar 20 '2015 10:03 Davideas