Как запретить Android делать снимок экрана, когда мое приложение переходит в фоновый режим? - PullRequest
139 голосов
/ 22 марта 2012

Приложение, которое я сейчас создаю, требует, чтобы приложение не позволяло ОС делать снимок экрана приложения, когда оно перемещается в фоновый режим из соображений безопасности.Таким образом, он не сможет видеть последний активный экран при переключении между приложениями.

Я планирую включить эту функцию в метод onPause класса приложения, но сначала мне нужно выяснить, как я могудостичь этой функциональности.

Так есть ли кто-нибудь, кто знает, как это исправить?

Ответы [ 4 ]

249 голосов
/ 22 марта 2012

Попробуйте 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);
  }
}

Это определенно защищает от ручных снимков экрана и автоматических снимков экрана из истории недавних задач ICS. Он также защищает от записи экрана (например, приложений, использующих API проецирования мультимедиа).

ОБНОВЛЕНИЕ : он также защищен от Now On Tap или других помощников на Android 6.0; они не получат доступ к деталям виджетов и контейнеров в вашем пользовательском интерфейсе, если пользователь вызовет помощника.

ОБНОВЛЕНИЕ № 2 : однако не все в действии будет защищено. Любые всплывающие окна & mdash; Dialog, Spinner, AutoCompleteTextView, переполнение панели действий и т. Д. & Mdash; будет небезопасным. Вы можете решить проблему Dialog, вызвав getWindow() и установив FLAG_SECURE. Остальное ... становится сложнее. Подробнее см. в этом блоге .

77 голосов
/ 20 июня 2012

Будьте осторожны с использованием WindowManager.LayoutParams.FLAG_SECURE, на некоторых устройствах (проверено на Samsung Galaxy ACE, например, GT-S5830) это сделает представление зашифрованным.Похоже, специфическая ошибка Samsung.Я рекомендую следующее:

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

Вот как выглядит скремблированный экран:

Scrambled Screen Image

Это работает правильно на телефонах ICS Samsung, поэтомуЯ предполагаю, что проблема связана с устройствами Gingerbread (или более старыми).

14 голосов
/ 20 марта 2015

Решение, предоставленное CommonsWare, продолжает действовать и в Lollipop.

Просто примечание, если вы хотите продолжить с , а не , см. Снимки в недавнем списке для всего app, ВСЕ реализованные действия должны указывать в методе onCreate() флаг getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); перед setContentView();

В противном случае снимок в недавнем списке покажет первое действие без флага, если пользовательперемещался по нему.

0 голосов
/ 24 октября 2018

Вот решение, позволяющее скрыть содержимое приложения, закрыв его заставкой, когда приложение помещается в фоновый режим.При этом не используется метод FLAG_SECURE, я просто переопределяю методы экранов onPause и onResume и изменяю представление так, чтобы оно отображало все, что находится сзади.

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

...