web-dev-qa-db-fra.com

Comment empêcher la capture d'écran sous Android

Est-il possible d'empêcher l'enregistrement d'écran dans l'application Android?

Je souhaite développer une application sécurisée Android. En cela, j'ai besoin de détecter les logiciels d'enregistrement d'écran qui fonctionnent en arrière-plan et de les tuer. J'ai utilisé SECURE FLAG pour empêcher les captures d'écran. Mais je ne sais pas s'il est possible d'empêcher la capture vidéo de l'écran Android également. Faites-moi savoir comment empêcher la capture d'écran (vidéo/captures d'écran).

58
Anand

Je vais dire qu'il est pas possible d'empêcher complètement la capture d'écran/vidéo de toute application Android par des moyens pris en charge. Mais si vous souhaitez uniquement le bloquer pour les appareils normaux Android, SECURE FLAG est considérable.

1) L'indicateur sécurisé bloque à la fois la capture d'écran et la capture vidéo normales.

Aussi la documentation à ce lien dit que

Indicateur de fenêtre: traite le contenu de la fenêtre comme étant sécurisé, en l'empêchant de s'afficher dans les captures d'écran ou d'être visualisé sur des écrans non sécurisés.

La solution ci-dessus empêchera sûrement les applications de capturer la vidéo de votre application

Voir la réponse ici .

2) Il existe d'autres moyens de capturer le contenu de l'écran.

Il peut être possible de capturer l'écran d'une autre application sur un appareil enraciné ou en utilisant le SDK,

que les deux offrent peu ou pas de chance que vous le bloquiez ou que vous en receviez notification.

Par exemple: il existe un logiciel pour refléter l'écran de votre téléphone sur votre ordinateur via le SDK et vous pouvez donc utiliser un logiciel de capture d'écran, non détectable par votre application.

Voir la réponse ici .

73
RobCob

Ajoutez simplement cette ligne:

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

Avant votre méthode setContentView().

39
Ido Naveh

Pour désactiver la capture d'écran:

Ajoutez la ligne de code suivante dans la méthode onCreate():

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

Pour activer la capture d'écran:

Recherchez LayoutParams.FLAG_SECURE et supprimez la ligne de code.

11
Rajesh Shetty

Essaye ça:

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
8
Jithu P.S

Vous pouvez créer votre application en tant que propriétaire de périphérique/profil et appeler setScreenCaptureDisabled(). À partir de docs , cette API effectue les opérations suivantes:

public void setScreenCaptureDisabled (ComponentName admin, booléen désactivé) Ajouté dans le niveau 21 de l'API

Appelé par un propriétaire de périphérique/profil pour définir si la capture d'écran est désactivée. La désactivation de la capture d'écran empêche également le contenu de affiché sur des périphériques d’affichage ne disposant pas d’une sortie vidéo sécurisée . Voir FLAG_SECURE pour plus de détails sur les surfaces sécurisées et sécurisées affiche.

L'administrateur du périphérique appelant doit être un propriétaire de périphérique ou de profil. Si c'est non, une exception de sécurité sera levée. Paramètres admin Which DeviceAdminReceiver auquel cette demande est associée. désactivé si La capture d'écran est désactivée ou non.

Vous pouvez également devenir un partenaire MDM (Mobile Device Management) . Les applications complémentaires fournissent des API supplémentaires à leurs applications partenaires MDM afin de contrôler le périphérique.

C’est actuellement le seul moyen d’appliquer des restrictions de capture d’écran.

7
rupesh jain

Pour les utilisateurs de Java

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

Pour les utilisateurs de kotlin

window.setFlags (WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)

1
user9778021

J'ai vu toutes les réponses qui ne conviennent qu'à une seule activité, mais il existe une solution qui bloquera la capture d'écran pour toutes les activités sans ajouter de code à l'activité. Créez d’abord une classe d’application personnalisée et ajoutez un registerActivityLifecycleCallbacks, puis enregistrez-la dans votre manifeste.

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) {
            }
        });
    }



}

manifeste

 <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">
1
Gk Mohammad Emon

Selon ce guide officiel , vous pouvez ajouter WindowManager.LayoutParams.FLAG_SECURE à la disposition de vos fenêtres et empêcher les captures d'écran.

1
r5d

J'ai utilisé cette solution pour autoriser la capture manuelle dans l'application tout en interdisant la capture d'écran lorsque l'application passe en arrière-plan. J'espère que cela aidera.

@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();
}
0
S.Bozzoni

à propos de la capture d'écran, FLAG_SECURE ne fonctionne pas.

mais si vous surveillez le fichier de capture d'écran, vous pouvez empêcher d'obtenir le fichier d'origine.

essayez ceci un

1. surveillance de la capture d’écran (moniteur de fichier) avec le service à distance Android
2. supprimer l'image d'origine de la capture d'écran .
3. livrer l'instance bitmap afin que vous puissiez modifier. 

0
Soo Chun Jung