Як запобігти захопленню екрана в Android


118

Чи можна запобігти запису екрана в додатку Android?

Я хотів би розробити додаток Android Secure. У цьому мені потрібно виявити програмне забезпечення для запису екрана, яке працює під фоном, і вбити їх. Я використовував ЗАХИСНИЙ ФЛАГ для запобігання знімків екрана. Але я не знаю, чи можна також запобігти захопленню відео екрану Android Screen. Дайте мені знати, як запобігти захопленню екрана (відео / скріншоти).


8
- Вам слід пам’ятати, що завжди можна вказувати камеру на екран, щоб вкрасти вміст. Є деякі методи, що використовуються в полі DRM, але вони досить складні, і я не знаю, що відбувається під кришкою
Шай Леві,

9
Концепція, яку пояснює @ShaiLevy, зазвичай називається Analog Hole en.wikipedia.org/wiki/Analog_hole, що пояснює неминучу дірку безпеки в передачі медіа.
gusridd

Відповіді:


126

Я хочу сказати, що неможливо повністю запобігти захопленню екрана / відео будь-якого додатка для Android через підтримувані засоби. Але якщо ви хочете заблокувати його лише для звичайних Android-пристроїв, БЕЗПЕЧНА ФЛАГ є суттєвою.

1) Безпечний прапор блокує як звичайний знімок екрана, так і відеозапис.

Також документація за цим посиланням говорить про це

Прапор вікна: ставитесь до вмісту вікна як до безпечного, не допускаючи його появи на екранах екрана або перегляду на незахищених екранах.

Наведене вище рішення напевно не дасть додаткам захоплювати відео вашого додатка

Дивіться відповідь тут .

2) Існують альтернативні засоби захоплення екранного контенту.

Можливо, можливо, захопити екран іншої програми на вкоріненому пристрої або за допомогою SDK,

які обидва не мають жодного шансу, щоб ви його заблокували або отримали повідомлення про це.

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

Дивіться відповідь тут .

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

11
або ви можете просто натиснути зображення за допомогою портативної камери.
Ravinder Payal

68

Просто додайте цей рядок:

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

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


11
Питання: [цитата] Я використав БЕЗПЕЧНУ ФЛАГУ [цитувати] Ваша "відповідь": [цитата] Ви можете використовувати 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і видаліть рядок коду.


12

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

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

Для користувачів kotlin

window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)

для kotlin, в залежності від контексту, це має бути, window?.set...тому що в "Діалогах" ви не знаєте, чи будете мати "Вікно".
Мартін

1
У початковому запитанні вже було сказано, що вони використовували захищений прапор, а ваша відповідь - використовувати захищений прапор. Це насправді не відповідає на поставлене запитання.
Subaru Tashiro

10

Здається, ви знаєте, як відключити знімки екрана зі свого додатка, і є інші відповіді, які допомагають вам у цьому. Але я спробую дати вам важливу інформацію, яку вам ніхто не дає.

1) Ви не можете мати додаток, який на 100% захищений від зйомки екрана (фото / відео). Там немає ніякого офіційного способу зробити скріншоти в Android. Якщо програма записує екрани, то вона повинна використовувати деякі непідтримувані методи (вкорінення або використання SDK).

Існує дуже мало можливостей для блокування програми, якщо він використовує кореневий доступ до екранів записів.

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, boolean disabled) Додано в рівні 21 API

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

Адміністратор виклику пристрою повинен бути власником пристрою чи профілю. Якщо цього немає, буде викинуто виняток із безпеки. Параметри адміністратора, з яким DeviceAdminReceiver пов'язаний цей запит. вимкнено Незалежно від зйомки екрана чи ні.

Крім того, ви можете стати партнером програми MDM (Mobile Device Management). ОЕМ надає додаткові API для своїх програм-партнерів MDM для управління пристроєм. Наприклад, Samsung пропонує програму API для керування записом екрану на пристрої своїм партнерам MDM.

Наразі це єдиний спосіб застосувати обмеження щодо зйомки екрана.


9

Спробуйте це:

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

3
Питання: [цитата] Я використав БЕЗПЕЧНУ ФЛАГУ [цитувати] Ваша "відповідь": [цитата] Ви можете використовувати FLAG_SECURE [unqote] Чи можете ви тут помітити проблему?
2Dee

Прапор вікна: ставитеся до вмісту вікна як до безпечного, не допускаючи його появи на екранах екрана або перегляду на незахищених екранах. Див. FLAG_SECURE для отримання детальної інформації про захищені поверхні та захищені екрани. Постійна величина: 8192 (0x00002000) Детальніше читайте тут developer.android.com/reference/android/view/…
Jithu PS

Будь ласка, не оскверняйте свою публікацію,
відкочуючи

8

Я побачив усі відповіді, які підходять лише для однієї діяльності, але є моє рішення, яке заблокує скріншот для всіх дій, не додаючи до цього жодного коду. Перш за все, складіть клас власної програми та додайте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

Я спробував мій проект, тоді він працював на всі види діяльності. @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. доставити екземпляр растрової карти, щоб ви могли змінити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.