2012-03-22 3 views
120

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

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

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

ответ

210

Попробуйте 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 истории последних-задач.

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

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

+5

@ Dany's: Собственно, это имеет отношение к вопросу. Я просто протестировал его на Nexus S (4.0.3), и он работает так, как ожидалось - снимок экрана последних заданий подавлен. Вы по-прежнему видите имя приложения и значок, но скриншот черный. Вы можете попробовать его на оборудовании ICS. – CommonsWare

+0

Спасибо, посмотрим, любая идея, если это также будет работать с пакетом обратной совместимости? – StingRay5

+2

@ StingRay5: «FLAG_SECURE» существует с самого начала - до недавнего времени он имел ограниченное значение. – CommonsWare

69

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

+6

Вы совершенно правы, мы столкнулись с этой проблемой, и это, безусловно, было необходимо для проверки уровня API. На самом деле забыл опубликовать это, так что спасибо за то, что он поднял его снова. :) – StingRay5

+0

Это также происходит на Samsung Gio (Gingerbread), но на Froyo его нормально - так оно происходит только на 2.3 – pixel

+0

Мы также заметили эту проблему. Вы можете проверить в эмуляторе устройства Gingerbread. – twaddington

14

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

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

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

+1

В моем приложении у меня есть функция настройки/очистки FLAG_SECURE на основе предпочтений пользователя. Он работал нормально до KITKAT, и черный экран можно увидеть в переключателе задач. В Lollipop в обзоре отображается последний снимок моего приложения, когда FLAG_SECURE не был установлен (очищен). –

+0

@ r.bhardwaj Я думаю, что в этом случае мы не сможем сделать так много, но вы можете посоветовать пользователю, что для изменения требуется приложение для перезапуска, чтобы полностью вносить эффект ;-), и все готово. – Davidea

+1

Кто-нибудь нашел способ раздуть пользовательский вид перед тем, как сделать снимок, поэтому это не просто черный экран? Я попытался раздуть представление о диспетчере окон в onPause, но, похоже, к тому времени уже слишком поздно. – user1064249

Смежные вопросы