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

118

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, je dois détecter les logiciels d'enregistrement d'écran qui fonctionnent en arrière-plan et les tuer. J'ai utilisé SECURE FLAG pour éviter les captures d'écran. Mais je ne sais pas s'il est également possible d'empêcher la capture vidéo de l'écran Android. Faites-moi savoir comment empêcher la capture d'écran (vidéo / captures d'écran).

Anand
la source
8
- Vous devez vous rappeler qu'on peut toujours pointer une caméra sur l'écran pour voler le contenu - Certaines techniques sont utilisées dans le domaine des DRM mais elles sont assez complexes et je ne sais pas vraiment ce qui se passe sous le capot
Shai Levy
9
Le concept que @ShaiLevy explique, est généralement appelé Analog Hole en.wikipedia.org/wiki/Analog_hole, ce qui explique le trou de sécurité inévitable de la transmission multimédia.
gusridd

Réponses:

126

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

1) Le drapeau sécurisé bloque à la fois la capture d'écran normale et la capture vidéo.

La documentation sur ce lien indique également que

Indicateur de fenêtre: traitez le contenu de la fenêtre comme sécurisé, en l' empêchant d'apparaître dans les captures d'écran ou d'être visualisé sur des affichages 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,

qui offrent tous deux peu ou aucune chance de le bloquer ou d'en recevoir une notification.

Par exemple: il existe un logiciel pour mettre en miroir l'écran de votre téléphone sur votre ordinateur via le SDK et ainsi un logiciel de capture d'écran pourrait être utilisé là-bas, impossible à découvrir par votre application.

Voir la réponse ici .

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
RobCob
la source
11
ou on peut simplement cliquer sur l'image avec une caméra portable.
Ravinder Payal
68

Ajoutez simplement cette ligne:

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

Avant votre setContentView()méthode.

Ido Naveh
la source
11
Question: [quote] J'ai utilisé SECURE FLAG [unquote] Votre "réponse": [quote] Vous pouvez utiliser FLAG_SECURE [unqote] Pouvez-vous repérer un problème ici?
2
Bonjour, je développe une application de portail Web. Les utilisateurs peuvent utiliser tout type de navigateur pour accéder à ce portail. Les utilisateurs de ce portail ne doivent pas prendre les captures d'écran lorsqu'ils utilisent des appareils mobiles. Puis-je utiliser les mêmes précautions (etWindow (). SetFlags (LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);) pour l'application Web. Fonctionne-t-il pour IOS? Si je peux utiliser le même type de précautions, où dois-je appeler cette ligne?
Ferda-Ozdemir-Sonmez
24

Pour désactiver la capture d'écran:

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

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

Pour activer la capture d'écran:

Recherchez LayoutParams.FLAG_SECUREet supprimez la ligne de code.

Rajesh Shetty
la source
12

Pour les utilisateurs Java, écrivez cette ligne au-dessus de votre setContentView(R.layout.activity_main);

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)
user9778021
la source
pour kotlin, selon le contexte, cela devrait être window?.set...parce que sur Dialogs, vous ne savez pas si vous allez avoir une fenêtre.
Martin Marconcini
1
La question d'origine indiquait déjà qu'ils ont utilisé un drapeau sécurisé et votre réponse est d'utiliser un drapeau sécurisé. Cela ne répond pas vraiment à la question posée.
Subaru Tashiro
10

Il semble que vous sachiez comment désactiver les captures d'écran de votre application et il existe d'autres réponses qui vous aident à ce sujet. Mais je vais essayer de vous donner des informations importantes que personne ne vous donne.

1) Vous ne pouvez pas avoir une application sécurisée à 100% contre la prise de captures d'écran (photo / vidéo). Il n'existe aucun moyen officiel de prendre des captures d'écran sous Android. Si une application enregistre des écrans, elle doit utiliser des méthodes non prises en charge (enracinement ou en utilisant le SDK).

Il y a très peu de possibilités pour vous de bloquer une application si elle utilise un accès root pour enregistrer des écrans.

2) Personne n'a mentionné ce problème ici, mais soyez très prudent lors de l'utilisation WindowManager.LayoutParams.FLAG_SECURE. Il a été vérifié sur de nombreux appareils (comme sur Samsung Galaxy ACE, par exemple GT-S5830), que cela rend la vue entière brouillée. Comme ça,

entrez la description de l'image ici

Veuillez mettre un chèque comme celui-ci,

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

Cela fonctionne parfaitement sur les appareils ICS, donc pas de problème.

3) J'ai également découvert que même sur les appareils plus récents comme Android 4.3, cela pose des problèmes d'animation lorsque l'écran est tourné. Veuillez vérifier ce rapport de bogue.

Aritra Roy
la source
28
vous ne devriez pas simplement copier et coller les réponses d'autres personnes pour obtenir des votes. Et ajoutez également une référence à l'endroit où vous avez copié votre réponse. stackoverflow.com/a/11121897/5437621
mrid
votre réponse est copier et coller, veuillez ne pas copier et coller la réponse de quelqu'un. vous devez copier cette réponse à partir de la mention du lien ci-dessous. stackoverflow.com/a/11121897/5437621
Abdul Basit Rishi
9

Vous pouvez faire de votre application le propriétaire de l'appareil / du profil et appeler setScreenCaptureDisabled(). À partir de la documentation , cette API effectue les opérations suivantes:

public void setScreenCaptureDisabled (ComponentName admin, boolean disabled) Ajouté au niveau d'API 21

Appelé par le propriétaire d'un appareil / profil pour définir si la capture d'écran est désactivée. La désactivation de la capture d'écran empêche également l'affichage du contenu sur les périphériques d'affichage qui ne disposent pas d'une sortie vidéo sécurisée. Consultez FLAG_SECURE pour plus de détails sur les surfaces sécurisées et les écrans sécurisés.

L'administrateur de l'appareil appelant doit être le propriétaire d'un appareil ou d'un profil. Si ce n'est pas le cas, une exception de sécurité sera levée. Paramètres admin À quel DeviceAdminReceiver cette demande est associée. disabled Si la capture d'écran est désactivée ou non.

Vous pouvez également devenir une application partenaire MDM (Mobile Device Management). L' OEM fournit des API supplémentaires à leurs applications partenaires MDM pour contrôler l'appareil.Par exemple, Samsung fournit une API pour contrôler l'enregistrement d'écran sur l'appareil à ses partenaires MDM.

Actuellement, c'est la seule façon d'appliquer les restrictions de capture d'écran.

rupesh jain
la source
9

Essaye ça:

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
Jithu PS
la source
3
Question: [quote] J'ai utilisé SECURE FLAG [unquote] Votre "réponse": [quote] Vous pouvez utiliser FLAG_SECURE [unqote] Pouvez-vous repérer un problème ici?
2
Indicateur de fenêtre: traitez le contenu de la fenêtre comme sécurisé, en l'empêchant d'apparaître dans les captures d'écran ou d'être visualisé sur des affichages non sécurisés. Consultez FLAG_SECURE pour plus de détails sur les surfaces sécurisées et les écrans sécurisés. Valeur constante: 8192 (0x00002000) En savoir plus sur ici developer.android.com/reference/android/view/…
Jithu PS
Veuillez ne pas altérer votre message en
annulant
8

J'ai vu toutes les réponses qui ne sont appropriées que pour une seule activité mais il y a ma solution qui bloquera la capture d'écran pour toutes les activités sans ajouter de code à l'activité. Commencez par créer une classe Application personnalisée et ajoutez-y une registerActivityLifecycleCallbacks.Ensuite, 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">
Gk Mohammad Emon
la source
ça marche dans tous les cas?
gopalanrc
J'ai essayé de mon projet puis cela a fonctionné pour toutes les activités. @gopalanrc
Gk Mohammad Emon
2

Selon ce guide officiel , vous pouvez ajouter WindowManager.LayoutParams.FLAG_SECUREà la disposition de votre fenêtre et cela interdira les captures d'écran.

r5d
la source
2

J'ai utilisé cette solution pour permettre un instantané manuel dans l'application tout en interdisant la capture d'écran lorsque l'application passe en arrière-plan, j'espère que cela aide.

@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
la source
0

à propos de la capture d'écran photo, FLAG_SECURE ne fonctionne pas sur l'appareil enraciné.

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

essayez celui- ci .

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

Soo Chun Jung
la source