Как я могу запретить Android делать скриншот, когда мое приложение переходит в фоновый режим?


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

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

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

3 124

3 ответа:

попробовать 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);
  }
}

это, безусловно, обеспечивает от Руководство по эксплуатации скриншоты и автоматические скриншоты из СВК последние-задачи истории. Он также защищает от записи на экране (например, приложения, использующие API медиапроекции).

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

обновление #2: однако, не все в деятельности будет защищено. Любые всплывающие окна - Dialog,Spinner,AutoCompleteTextView, переполнение панели действий и т. д. - будет небезопасно. Вы можете исправить

будьте осторожны с использованием WindowManager.Ни.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 телефонов, хотя, поэтому я предполагаю, что проблема изолирована от пряничных устройств (или старше).

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

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

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