Как запретить Android делать снимок экрана, когда мое приложение переходит на задний план?

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

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

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

4b9b3361

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

UPDATE: он также защищает от On-On-On или других помощников на Android 6.0; они не получат доступ к деталям виджетов и контейнеров в пользовательском интерфейсе, если пользователь вызывает помощника.

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

201
ответ дан 22 марта '12 в 15:48
источник

Будьте внимательны при использовании 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 (или старше).

68
ответ дан 20 июня '12 в 17:33
источник

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

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

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

13
ответ дан 20 марта '15 в 13:39
источник