Cómo evitar la captura de pantalla en Android

118

¿Es posible evitar la grabación de pantalla en la aplicación de Android?

Me gustaría desarrollar una aplicación segura para Android. En eso, necesito detectar el software de grabación de pantalla que se está ejecutando en segundo plano y eliminarlo. He utilizado SECURE FLAG para evitar capturas de pantalla. Pero no sé si es posible evitar la captura de video de la pantalla de Android también. Déjame saber cómo evitar la captura de pantalla (video / capturas de pantalla).

Anand
fuente
8
- Debes recordar que siempre se puede apuntar una cámara en la pantalla para robar el contenido - Hay algunas técnicas utilizadas en el campo de DRM pero son bastante complejas y realmente no sé qué está pasando debajo del capó
Shai Levy
9
El concepto que explica @ShaiLevy, generalmente se llama Analog Hole en.wikipedia.org/wiki/Analog_hole, lo que explica el innevitable agujero de seguridad de la transmisión de medios.
gusridd

Respuestas:

126

Voy a decir que no es posible evitar completamente la captura de pantalla / video de ninguna aplicación de Android a través de medios compatibles. Pero si solo desea bloquearlo para dispositivos Android normales , la BANDERA SEGURA es sustancial.

1) La bandera de seguridad bloquea tanto la captura de pantalla normal como la captura de video.

También la documentación en este enlace dice que

Indicador de ventana: trata el contenido de la ventana como seguro, evitando que aparezca en capturas de pantalla o que se vea en pantallas no seguras.

La solución anterior seguramente evitará que las aplicaciones capturen videos de su aplicación

Vea la respuesta aquí .

2) Existen medios alternativos para capturar el contenido de la pantalla.

Puede ser posible capturar la pantalla de otra aplicación en un dispositivo rooteado o mediante el uso del SDK,

que ofrecen poca o ninguna posibilidad de que lo bloquees o de que recibas una notificación.

Por ejemplo: existe un software para reflejar la pantalla de su teléfono en su computadora a través del SDK y, por lo tanto, el software de captura de pantalla podría usarse allí, sin que su aplicación lo pueda descubrir.

Vea la respuesta aquí .

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
RobCob
fuente
11
o simplemente se puede hacer clic en la imagen con la cámara de mano.
Ravinder Payal
68

Solo agrega esta línea:

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);

Antes de tu setContentView()método.

Ido Naveh
fuente
11
Pregunta: [cita] He utilizado SECURE FLAG [unquote] Su "respuesta": [cita] Puede utilizar FLAG_SECURE [unqote] ¿Puede encontrar un problema aquí?
2Dee
Hola, estoy desarrollando una aplicación de portal basada en web. Los usuarios pueden utilizar cualquier tipo de navegador para acceder a este portal. Los usuarios de este portal no deben realizar capturas de pantalla cuando estén utilizando dispositivos móviles. ¿Puedo usar las mismas precauciones (etWindow (). SetFlags (LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);) para la aplicación web. ¿Funciona para IOS? Si puedo usar el mismo tipo de precauciones, ¿dónde debo llamar a esta línea?
Ferda-Ozdemir-Sonmez
24

Para deshabilitar la captura de pantalla:

Agregue la siguiente línea de código en el onCreate()método:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
                           WindowManager.LayoutParams.FLAG_SECURE);

Para habilitar la captura de pantalla:

Busque LayoutParams.FLAG_SECUREy elimine la línea de código.

Rajesh Shetty
fuente
12

Para los usuarios de Java, escriba esta línea sobre su setContentView(R.layout.activity_main);

getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);

Para usuarios de kotlin

window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)
usuario9778021
fuente
para kotlin, dependiendo del contexto, eso debería ser window?.set...porque en los Diálogos, no sabes si vas a tener una Ventana.
Martin Marconcini
1
La pregunta original ya decía que usaron una bandera segura y su respuesta es usar una bandera segura. Esto realmente no responde a la pregunta publicada.
Subaru Tashiro
10

Parece que sabe cómo deshabilitar las capturas de pantalla de su aplicación y hay otras respuestas que lo ayudan en eso. Pero intentaré darte información importante que nadie te está dando.

1) No puede tener una aplicación que sea 100% segura para tomar capturas de pantalla (foto / video). No existe una forma oficial de realizar capturas de pantalla en Android. Si una aplicación está grabando pantallas, entonces debe estar usando algunos métodos no compatibles (ya sea rootear o usar el SDK).

Hay muy poco margen para bloquear una aplicación si está usando acceso de root para grabar pantallas.

2) Nadie mencionó este problema aquí, pero tenga mucho cuidado al usarlo WindowManager.LayoutParams.FLAG_SECURE. Se ha verificado en muchos dispositivos (como en Samsung Galaxy ACE, por ejemplo, GT-S5830), que esto hace que toda la vista esté codificada. Me gusta esto,

ingrese la descripción de la imagen aquí

Por favor ponga un cheque como este,

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

Funciona perfectamente en dispositivos ICS, así que no hay problema.

3) También descubrí que incluso en dispositivos más nuevos como Android 4.3, esto causa problemas de animación cuando se gira la pantalla. Por favor, compruebe el informe de error.

Aritra Roy
fuente
28
no debe simplemente copiar y pegar las respuestas de otras personas para obtener votos. Y también agregue una referencia al lugar de donde copió su respuesta. stackoverflow.com/a/11121897/5437621
mrid
su respuesta es copiar y pegar, por favor no copie y pegue la respuesta de alguien. ha copiado esta respuesta del enlace que se menciona a continuación. stackoverflow.com/a/11121897/5437621
Abdul Basit Rishi
9

Puede hacer su aplicación como propietario de dispositivo / perfil y llamar setScreenCaptureDisabled(). De los documentos , esta api hace lo siguiente:

public void setScreenCaptureDisabled (ComponentName admin, boolean disabled) Agregado en API nivel 21

Lo llama el propietario de un dispositivo / perfil para establecer si la captura de pantalla está deshabilitada. La desactivación de la captura de pantalla también evita que el contenido se muestre en dispositivos de visualización que no tienen una salida de video segura. Consulte FLAG_SECURE para obtener más detalles sobre superficies seguras y pantallas seguras.

El administrador del dispositivo que realiza la llamada debe ser el propietario del dispositivo o del perfil. Si no es así, se lanzará una excepción de seguridad. Parámetros admin Con qué DeviceAdminReceiver está asociada esta solicitud. disabled Si la captura de pantalla está desactivada o no.

Alternativamente, puede convertirse en una aplicación de socio de MDM (Mobile Device Management) .OEMs proporciona API adicionales a sus aplicaciones de socio de MDM para controlar el dispositivo. Por ejemplo, Samsung proporciona una API para controlar la grabación de pantalla en el dispositivo a sus socios de MDM.

Actualmente, esta es la única forma de hacer cumplir las restricciones de captura de pantalla.

rupesh jain
fuente
9

Prueba esto:

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
Jithu PD
fuente
3
Pregunta: [cita] He utilizado SECURE FLAG [unquote] Su "respuesta": [cita] Puede utilizar FLAG_SECURE [unqote] ¿Puede encontrar un problema aquí?
2Dee
Indicador de ventana: trata el contenido de la ventana como seguro, evitando que aparezca en capturas de pantalla o que se vea en pantallas no seguras. Consulte FLAG_SECURE para obtener más detalles sobre superficies seguras y pantallas seguras. Valor constante: 8192 (0x00002000) Lea más aquí developer.android.com/reference/android/view/…
Jithu PS
Por favor, no estropees tu publicación
revertiendo
8

Vi todas las respuestas que son apropiadas solo para una sola actividad, pero existe mi solución que bloqueará la captura de pantalla para todas las actividades sin agregar ningún código a la actividad. En primer lugar, cree una clase de aplicación personalizada y agregue un. registerActivityLifecycleCallbacksLuego regístrelo en su manifiesto.

MyApplicationContext.class

public class MyApplicationContext extends Application {
    private  Context context;
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
        setupActivityListener();
    }

    private void setupActivityListener() {
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);            }
            @Override
            public void onActivityStarted(Activity activity) {
            }
            @Override
            public void onActivityResumed(Activity activity) {

            }
            @Override
            public void onActivityPaused(Activity activity) {

            }
            @Override
            public void onActivityStopped(Activity activity) {
            }
            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
            }
            @Override
            public void onActivityDestroyed(Activity activity) {
            }
        });
    }



}

Manifiesto

 <application
        android:name=".MyApplicationContext"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
Gk Mohammad Emon
fuente
¿Funciona en todos los casos?
gopalanrc
Probé mi proyecto y luego funcionó para todas las actividades. @gopalanrc
Gk Mohammad Emon
2

Según esta guía oficial , puede agregar WindowManager.LayoutParams.FLAG_SECUREal diseño de su ventana y no permitirá capturas de pantalla.

r5d
fuente
2

Utilicé esta solución para permitir instantáneas manuales en la aplicación y no permitir la captura de pantalla cuando la aplicación pasa a segundo plano, espero que ayude.

@Override
protected void onResume() {
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
    super.onResume();
}

@Override
protected void onPause() {
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
    super.onPause();
}
S.Bozzoni
fuente
0

sobre la captura de pantalla de la foto, FLAG_SECURE no funciona en el dispositivo rooteado.

pero si supervisa el archivo de captura de pantalla, puede evitar obtener el archivo original.

probar este uno .

1. monitorización de la captura de pantalla (monitor de archivos) con el servicio remoto de Android
2. eliminar la imagen de captura de pantalla original.
3. entregar la instancia de mapa de bits para que pueda modificarla.

Soo Chun Jung
fuente