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

118

Можно ли запретить запись экрана в приложении Android?

Я хочу разработать безопасное приложение для Android. В этом случае мне нужно обнаружить программы для записи экрана, которые работают в фоновом режиме, и убить их. Я использовал SECURE FLAG для предотвращения скриншотов. Но я не знаю, можно ли также предотвратить захват видео с экрана Android. Дайте мне знать, как предотвратить захват экрана (видео / скриншоты).

Ананд
источник
8
- Вы должны помнить, что всегда можно навести камеру на экран, чтобы украсть контент - В области DRM используются некоторые методы, но они довольно сложны, и я действительно не знаю, что происходит под капотом
Шай Леви,
9
Концепция, которую объясняет @ShaiLevy, обычно называется аналоговой дырой en.wikipedia.org/wiki/Analog_hole, которая объясняет неизбежную дыру в безопасности передачи мультимедиа.
gusridd

Ответы:

126

Я собираюсь сказать, что невозможно полностью предотвратить захват экрана / видео любого приложения для Android с помощью поддерживаемых средств. Но если вы хотите заблокировать его только для обычных устройств Android, БЕЗОПАСНЫЙ ФЛАГ существенен.

1) Флаг безопасности блокирует как обычный снимок экрана, так и захват видео.

Также документация по этой ссылке говорит, что

Флаг окна: обрабатывать содержимое окна как безопасное, предотвращая его отображение на снимках экрана или просмотр на незащищенных дисплеях.

Вышеупомянутое решение наверняка помешает приложениям записывать видео вашего приложения.

Смотрите ответ здесь .

2) Существуют альтернативные способы захвата содержимого экрана.

Можно сделать снимок экрана другого приложения на корневом устройстве или с помощью SDK,

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

Например: существует программное обеспечение для зеркального отображения экрана вашего телефона на вашем компьютере через SDK, поэтому там можно использовать программное обеспечение для захвата экрана, которое ваше приложение не обнаружит.

Смотрите ответ здесь .

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
Робкоб
источник
11
или можно просто щелкнуть изображение с помощью портативной камеры.
Рэвиндер Пайал,
68

Просто добавьте эту строку:

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

Перед вашим setContentView()методом.

Идо Навех
источник
11
Вопрос: [цитата] Я использовал БЕЗОПАСНЫЙ ФЛАГ [unquote] Ваш "ответ": [цитата] Вы можете использовать FLAG_SECURE [unqote] Вы можете найти здесь проблему?
2Dee
Привет, я разрабатываю веб-портал. Пользователи могут использовать любые браузеры для доступа к этому порталу. Пользователи этого портала не должны делать снимки экрана при использовании мобильных устройств. Могу ли я использовать те же меры предосторожности (etWindow (). SetFlags (LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);) для веб-приложения. На IOS работает? Если я могу использовать такие же меры предосторожности, где мне позвонить по этой линии?
Ферда-Оздемир-
24

Чтобы отключить захват экрана:

Добавьте в onCreate()метод следующую строку кода :

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

Чтобы включить снимок экрана:

Найдите LayoutParams.FLAG_SECUREи удалите строку кода.

Раджеш Шетти
источник
13

Для пользователей Java напишите эту строку над вашим setContentView(R.layout.activity_main);

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

Для пользователей котлина

window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)
user9778021
источник
для kotlin, в зависимости от контекста, это должно быть window?.set...потому, что в диалогах вы не знаете, будет ли у вас Window.
Мартин Маркончини
1
В исходном вопросе уже говорилось, что они использовали безопасный флаг, и ваш ответ - использовать безопасный флаг. Это не совсем ответ на поставленный вопрос.
Subaru Tashiro,
10

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

1) Вы не можете иметь приложение, которое на 100% защищено от снимков экрана (фото / видео). Там нет никакого официального способа сделать скриншоты в Android. Если приложение записывает экраны, то оно должно использовать некоторые неподдерживаемые методы (либо рутирование, либо использование SDK).

У вас очень мало возможностей заблокировать приложение, если оно использует root-доступ для записи экранов.

2) Никто здесь не упоминал об этой проблеме, но будьте очень осторожны при использовании WindowManager.LayoutParams.FLAG_SECURE. На многих устройствах (например, на Samsung Galaxy ACE, например, GT-S5830) было проверено, что это приводит к искажению всего изображения. Как это,

введите описание изображения здесь

Поставьте, пожалуйста, такой чек,

if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
}

Он отлично работает на устройствах ICS, так что проблем нет.

3) Я также обнаружил, что даже на новых устройствах, таких как Android 4.3, это вызывает проблемы с анимацией при повороте экрана. Пожалуйста, проверьте этот отчет об ошибке.

Аритра Рой
источник
28
Вы не должны просто копировать и вставлять ответы других людей для получения голосов. А также добавьте ссылку на то, откуда вы скопировали свой ответ. stackoverflow.com/a/11121897/5437621
mrid
Ваш ответ - скопируйте и вставьте, пожалуйста, не копируйте и не вставляйте чей-либо ответ. вы скопировали этот ответ по указанной ниже ссылке. stackoverflow.com/a/11121897/5437621
Абдул Басит Риши
9

Вы можете сделать свое приложение владельцем устройства / профиля и позвонить setScreenCaptureDisabled(). Из документации этот API делает следующее:

public void setScreenCaptureDisabled (Администратор ComponentName, логическое значение отключено) Добавлено в API уровня 21

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

Администратор вызывающего устройства должен быть владельцем устройства или профиля. Если это не так, будет создано исключение безопасности. Параметры admin С каким DeviceAdminReceiver связан этот запрос. disabled Независимо от того, отключен ли снимок экрана.

В качестве альтернативы вы можете стать партнерским приложением MDM (Mobile Device Management). OEM-производители предоставляют дополнительные API-интерфейсы для своих партнерских приложений MDM для управления устройством. Например, Samsung предоставляет API-интерфейс для управления записью экрана на устройстве своим партнерам по MDM.

В настоящее время это единственный способ применить ограничения захвата экрана.

рупеш джайн
источник
9

Попробуй это:

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
Джиту PS
источник
3
Вопрос: [цитата] Я использовал БЕЗОПАСНЫЙ ФЛАГ [unquote] Ваш "ответ": [цитата] Вы можете использовать FLAG_SECURE [unqote] Вы можете найти здесь проблему?
2Dee
Флаг окна: обрабатывать содержимое окна как безопасное, предотвращая его отображение на снимках экрана или просмотр на незащищенных дисплеях. См. FLAG_SECURE для получения дополнительных сведений о защищенных поверхностях и безопасных дисплеях. Постоянное значение: 8192 (0x00002000) Подробнее здесь developer.android.com/reference/android/view/…
Jithu PS
Пожалуйста, не искажайте свой пост
откатом
8

Я видел все ответы, которые подходят только для одного действия, но есть мое решение, которое блокирует снимок экрана для всех действий без добавления кода к действию. Прежде всего создайте класс Custom Application и добавьте. registerActivityLifecycleCallbacksЗатем зарегистрируйте его в своем манифесте.

MyApplicationContext.class

public class MyApplicationContext extends Application {
    private  Context context;
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
        setupActivityListener();
    }

    private void setupActivityListener() {
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);            }
            @Override
            public void onActivityStarted(Activity activity) {
            }
            @Override
            public void onActivityResumed(Activity activity) {

            }
            @Override
            public void onActivityPaused(Activity activity) {

            }
            @Override
            public void onActivityStopped(Activity activity) {
            }
            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
            }
            @Override
            public void onActivityDestroyed(Activity activity) {
            }
        });
    }



}

Манифест

 <application
        android:name=".MyApplicationContext"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
Гк Мохаммад Эмон
источник
Я пробовал свой проект, тогда он работал для всех видов деятельности. @gopalanrc
Gk Mohammad Emon
2

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

@Override
protected void onResume() {
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
    super.onResume();
}

@Override
protected void onPause() {
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
    super.onPause();
}
С.Боццони
источник
0

насчет скриншота фото, FLAG_SECURE не работает рутированное устройство.

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

попробуйте этот один .

1. мониторинг снимка экрана (файловый монитор) с помощью удаленной службы Android
2. удалить исходное изображение снимка экрана.
3. доставьте экземпляр растрового изображения, чтобы его можно было изменить.

Су Чун Чжон
источник