Как запретить Android делать снимок экрана, когда мое приложение переходит на задний план?
В приложении, которое я сейчас создаю, есть требование, чтобы приложение не позволяло ОС делать снимок экрана приложения, когда он был вставлен в фоновый режим по соображениям безопасности. Таким образом, при переключении между приложениями он не сможет увидеть последний активный экран.
Я планирую использовать эту функциональность в методе onPause класса приложения, но сначала мне нужно выяснить, как я могу достичь этой функциональности.
Так есть кто-нибудь, кто знает, как это исправить?
Ответы
Ответ 1
Попробуйте 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: однако, не все в деятельности будет защищено. Любые всплывающие окна &— Dialog
, Spinner
, AutoCompleteTextView
, переполнение панели действий и т.д. & Mdash; будет небезопасным. Вы можете исправить проблему Dialog
, вызвав getWindow()
и установив FLAG_SECURE
. Остальное... становится сложнее. Смотрите этот блог, чтобы узнать больше.
Ответ 2
Будьте внимательны при использовании 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 (или старше).
Ответ 3
Решение, предоставляемое CommonsWare, продолжает действовать и в Lollipop.
Просто обратите внимание, что если вы хотите продолжать не видеть моментальные снимки в последнем списке для всего приложения, ВСЕ реализованные действия должны указывать в методе onCreate()
флаг getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
до setContentView();
В противном случае моментальный снимок в последнем списке покажет первое действие без флага, если пользователь переместился через него.
Ответ 4
Вот решение, позволяющее скрыть содержимое приложения, закрыв его заставкой, когда приложение помещается в фоновый режим. Это не использует технику FLAG_SECURE, я просто переопределяю методы onPause и onResume экранов и изменяю представление, чтобы показать то, которое покрывает все в задней части.
fooobar.com/questions/979080/...
Ответ 5
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE);
это сработало для меня, оно не позволяет делать снимки экрана, а также любые встроенные или сторонние приложения для записи с экрана записи.