запретить захват экрана в приложениях для Android

Мне было интересно, есть ли способ определить с помощью какого-либо метода обратного вызова «onXXXXX» или полученной трансляции, если какой-либо другой процесс собирается сделать снимок экрана моего приложения. Например, если инструменты SDK или какое-либо другое приложение для захвата экрана выполняет «захват экрана», я хотел бы получить уведомление, а затем решить, следует ли разрешить или запретить захват экрана.

Если это невозможно, есть ли способ заблокировать дисплей, чтобы никакой другой процесс не мог захватить мой экран?


person burgwindeck    schedule 20.07.2011    source источник


Ответы (2)


не поддерживается метод для создания снимка экрана другого приложения на Андроид. Единственные способы включают либо рутирование, либо использование SDK, которые практически не дают вам шанса заблокировать или получить уведомление об этом. Если другое приложение делает снимок экрана, оно по умолчанию использует неподдерживаемые методы и, вероятно, может делать то, что ему заблагорассудится.

Я хотел бы уточнить, что я не подразумеваю, что вы не должны использовать какие-либо доступные методы для защиты вашего приложения. Я просто сообщаю вам, что это, вероятно, невозможно сделать без использования неподдерживаемых методов, и что даже если вы их используете, вы не можете быть на 100% защищены от скриншотов.

person jakebasile    schedule 20.07.2011
comment
На самом деле, в официальных источниках есть начало такой возможности, и ее можно использовать на ряде устройств поставщиков приложениями без полномочий root. - person Chris Stratton; 20.07.2011
comment
Тем не менее, они не являются официальными, пока не будут включены в документацию по API. Я просто говорю, что, поскольку любой метод создания снимка экрана в настоящее время либо не поддерживается, либо напрямую из SDK, скорее всего, нет официальных методов взаимодействия с ним. - person jakebasile; 20.07.2011
comment
А как насчет View.getDrawingCache(boolean autoScale)? Документ гласит: Возвращает растровое изображение, в котором кэшируется этот чертеж вида. - person iDroid; 20.07.2011
comment
@Jake Basile - когда желание состоит в том, чтобы что-то заблокировать, не имеет значения, является ли эта возможность официальной, имеет значение только то, работает ли она - если она работает, вы можете поспорить, что кто-то ее использует. Кажется, мы согласны с тем, что полностью закрыть дверь невозможно. Однако, если/когда появится официальная возможность делать снимки экрана, вероятно, будет механизм блокировки полей пароля и т. д. Однако было бы ошибкой ограничивать анализ безопасности официальными возможностями. - person Chris Stratton; 20.07.2011
comment
@Chris Stratton Конечно, это следует учитывать, но я не говорю, что не следует. Я просто говорю, что, вероятно, нет никакой официальной поддержки скриншотов, и что для их блокировки потребуются такие же неподдерживаемые методы. - person jakebasile; 20.07.2011
comment
@iDroid, который вернет кеш чертежей вида, но его будет вызывать только ваше собственное приложение, а не какая-то третья сторона (если вы не откроете его каким-либо образом, но тогда у вас все равно будет контроль). Я не думаю, что ОП беспокоится о том, чтобы делать собственные скриншоты. - person jakebasile; 20.07.2011
comment
Захват экрана в современной DDMS основан на API поверхностного флингера, который фактически блокирует захват защищенных окон — см. android.git.kernel.org/?p=platform/frameworks/ Однако ряд поставщиков что-то делают более эффективно использовать GPU и пропускать эту проверку. - person Chris Stratton; 20.07.2011
comment
@Chris Stratton - ответ Джейка точен; ОП хотел узнать об официальных механизмах безопасности. - person cdhabecker; 20.07.2011
comment
@cdhabecker - В вопросе нет ничего, ограничивающего официальные средства защиты; практически говоря, проблема заключается в борьбе как с официальными, так и с неофициальными средствами создания скриншотов (или каким-либо другим приложением для захвата экрана), что делает проблему без реального решения. - person Chris Stratton; 20.07.2011

Это сработало для меня на Samsung Tab 2 7 ".

Используя следующий подход, просто добавьте FLAG_SECURE к Оконные флаги

public class FlagSecureTestActivity extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getWindow().setFlags(LayoutParams.FLAG_SECURE,
                         LayoutParams.FLAG_SECURE);

    setContentView(R.layout.main);
  }
}

с оговоркой, что вам, возможно, придется изменить

LayoutParams

to

WindowManager.LayoutParams
person user330844    schedule 27.08.2012
comment
Это работает и должно быть ответом для большинства разработчиков. - person John Pang; 30.11.2014
comment
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); не работает для Android Pie. - person Rajeev Sahu; 03.10.2018