Comment puis-je empêcher Android prendre une capture d'écran lorsque mon application va à l'arrière-plan?

l'application que je suis en train de construire a l'exigence que l'application doit empêcher L'OS de prendre une capture d'écran de l'application quand il est poussé dans l'arrière-plan pour des raisons de sécurité. De cette façon, il ne sera pas en mesure de voir le dernier écran actif lors de la commutation entre les applications.

j'envisage de mettre cette fonctionnalité dans la méthode onPause de la classe application, mais d'abord je dois savoir comment je peux atteindre cette fonctionnalité.

Donc, il y a il ya quelqu'un qui a une idée de comment résoudre ce problème?

124
demandé sur korius 2012-03-22 16:14:40

3 réponses

Essayer 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 garantit certainement contre les screenshots manuels et les screenshots automatiques de L'histoire des tâches récentes ICS. Il protège également contre l'enregistrement sur écran (par exemple, les applications utilisant les API de projection multimédia).

mise à jour : il assure également contre maintenant sur le robinet ou d'autres assistants sur Android 6.0; ils n'auront pas accès aux détails des widgets et les conteneurs dans votre INTERFACE utilisateur si l'utilisateur ouvre l'assistant.

mise à jour #2 : cependant, tout dans l'activité ne sera pas protégé. Toutes les fenêtres pop-up- Dialog , Spinner , AutoCompleteTextView , débordement de la barre d'action, etc. - ne sera pas sécurisé. Vous pouvez régler le problème Dialog en appelant getWindow() et en positionnant FLAG_SECURE . Reste... qui est difficile. Voir ce billet de blog pour plus d'informations.

228
répondu CommonsWare 2018-03-29 16:33:05

faites attention avec WindowManager.LayoutParams.FLAG_SECURE, sur certains appareils (vérifié sur Samsung Galaxy ACE, par exemple GT-S5830) cela fera la vue brouillée. On dirait un insecte spécifique de 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 les téléphones ICS Samsung, donc je suppose que le problème est isolé aux dispositifs en pain d'épice (ou plus anciens).

69
répondu gardarh 2016-05-18 16:49:04

la solution fournie par CommonsWare continue à être valable aussi dans Lollipop.

juste une note, si vous voulez continuer à pas voir les instantanés dans la liste récente pour le entier app, toutes les activités mises en œuvre doivent préciser dans le 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 le drapeau si l'utilisateur de naviguer à travers elle.

14
répondu Davidea 2015-03-20 10:39:40