web-dev-qa-db-fra.com

Comment empêcher Android de prendre une capture d'écran lorsque mon application passe en arrière-plan?

L'application que je suis en train de créer requiert que l'application empêche le système d'exploitation de prendre une capture d'écran de l'application lorsqu'elle est mise à l'arrière-plan pour des raisons de sécurité. Ainsi, il ne sera pas possible de voir le dernier écran actif lors du basculement entre les applications.

Je prévois de mettre cette fonctionnalité dans la méthode onPause de la classe d'application, mais je dois d'abord découvrir comment atteindre cette fonctionnalité.

Alors, y a-t-il quelqu'un qui sait comment résoudre ce problème?

138
StingRay5

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

Cela protège définitivement contre les captures d'écran manuelles et automatiques de l'historique ICS des tâches récentes. Il protège également contre l'enregistrement à l'écran (par exemple, les applications utilisant les API de projection multimédia).

[~ # ~] mettre à jour [~ # ~] : il est également sécurisé contre Now On Tap ou d'autres assistants sur Android = 6.0; ils n'auront pas accès aux détails des widgets et des conteneurs de votre interface utilisateur si l'utilisateur ouvre l'assistant.

UPDATE # 2 : cependant, tout dans l'activité ne sera pas protégé. Toute fenêtre contextuelle - Dialog, Spinner, AutoCompleteTextView, débordement de la barre d’action, etc. - ne sera pas sécurisée. Vous pouvez résoudre le problème Dialog en appelant getWindow() et en définissant FLAG_SECURE. Le reste ... devient difficile. Voir cet article de blog pour plus.

248
CommonsWare

Faites attention à l'utilisation de WindowManager.LayoutParams.FLAG_SECURE, sur certains périphériques (vérifiée sur le Samsung Galaxy ACE, par exemple GT-S5830), cela rendra la vue brouillée. On dirait un bug spécifique à Samsung. Je recommande ce qui suit:

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

Voici à quoi ressemble un écran brouillé:

Scrambled Screen Image

Cela fonctionne correctement sur ICS les téléphones Samsung, par conséquent, je suppose donc que le problème est isolé des périphériques Gingerbread (ou des versions antérieures).

76
gardarh

La solution fournie par CommonsWare reste valable également dans Lollipop.

Juste une note, si vous voulez continuer à pas voir les instantanés dans la liste récente pour l'application entière, TOUTES les activités implémentées doivent être spécifiées dans la onCreate() méthode le drapeau getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); avant setContentView();

Sinon, un instantané dans la liste récente affichera la première activité sans l'indicateur si l'utilisateur l'a parcourue.

13
Davideas

Voici une solution pour masquer le contenu d'une application en la recouvrant d'un écran de démarrage lorsque l'application est mise en arrière-plan. Ce n'est pas en utilisant la technique FLAG_SECURE, je substitue simplement les méthodes onPause et onResume des écrans et modifie la vue pour en afficher une qui couvre tout ce qui se trouve à l'arrière.

https://stackoverflow.com/a/52976001/6686912

0
D. Maul