Jak zapobiec przechwytywaniu ekranu w systemie Android

118

Czy można zapobiec nagrywaniu ekranu w aplikacji na Androida?

Chciałbym opracować bezpieczną aplikację dla systemu Android. W tym celu muszę wykryć oprogramowanie do nagrywania ekranu, które działa w tle i je zabić. Użyłem BEZPIECZNEJ FLAGI do zapobiegania zrzutom ekranu. Ale nie wiem, czy można również zapobiec przechwytywaniu wideo z ekranu Androida. Daj mi znać, jak zapobiec przechwytywaniu ekranu (wideo / zrzuty ekranu).

Anand
źródło
8
- Należy pamiętać, że zawsze można skierować kamerę na ekran, aby ukraść zawartość - Istnieją pewne techniki stosowane w dziedzinie DRM, ale są one dość złożone i naprawdę nie wiem, co się dzieje pod maską
Shai Levy
9
Koncepcja, którą wyjaśnia @ShaiLevy, zwykle nazywa się Analog Hole en.wikipedia.org/wiki/Analog_hole, co wyjaśnia możliwą lukę w zabezpieczeniach transmisji mediów.
gusridd

Odpowiedzi:

126

Powiem, że nie można całkowicie uniemożliwić przechwytywania ekranu / wideo dowolnej aplikacji na Androida za pomocą obsługiwanych środków. Ale jeśli chcesz go zablokować tylko dla zwykłych urządzeń z Androidem, BEZPIECZNA FLAGA jest znacząca.

1) Flaga bezpieczeństwa blokuje zarówno normalne zrzuty ekranu, jak i przechwytywanie wideo.

Również dokumentacja pod tym linkiem mówi, że

Flaga okna: traktuj zawartość okna jako bezpieczną, zapobiegając wyświetlaniu go na zrzutach ekranu lub wyświetlaniu na niezabezpieczonych wyświetlaczach.

Powyższe rozwiązanie z pewnością uniemożliwi aplikacjom przechwytywanie wideo z Twojej aplikacji

Zobacz odpowiedź tutaj .

2) Istnieją alternatywne sposoby przechwytywania zawartości ekranu.

Możliwe jest przechwycenie ekranu innej aplikacji na zrootowanym urządzeniu lub przy użyciu pakietu SDK,

które obie dają niewielką lub żadną szansę na zablokowanie go lub otrzymanie powiadomienia o tym.

Na przykład: istnieje oprogramowanie do tworzenia kopii lustrzanych ekranu telefonu na komputerze za pośrednictwem zestawu SDK, dzięki czemu można tam użyć oprogramowania do przechwytywania ekranu, którego aplikacja nie może wykryć.

Zobacz odpowiedź tutaj .

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
RobCob
źródło
11
lub po prostu kliknij obraz za pomocą ręcznej kamery.
Ravinder Payal
68

Po prostu dodaj tę linię:

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

Przed setContentView()metodą.

Ido Naveh
źródło
11
Pytanie: [quote] Użyłem BEZPIECZNEJ FLAGI [unquote] Twoja „odpowiedź”: [quote] Możesz użyć FLAG_SECURE [unqote] Czy widzisz tutaj problem?
Zobacz
Witam, tworzę aplikację portalową opartą na sieci WWW. W celu dotarcia do tego portalu użytkownicy mogą korzystać z dowolnej przeglądarki. Użytkownicy tego portalu nie powinni robić zrzutów ekranu, gdy korzystają z urządzeń mobilnych. Czy mogę zastosować te same środki ostrożności (etWindow (). SetFlags (LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);) dla aplikacji internetowej. Czy to działa na IOS? Jeśli mogę zastosować te same środki ostrożności, to gdzie mam zadzwonić na tę linię?
Ferda-Ozdemir-Sonmez
24

Aby wyłączyć przechwytywanie ekranu:

Dodaj następujący wiersz kodu w onCreate()metodzie:

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

Aby włączyć przechwytywanie ekranu:

Znajdź LayoutParams.FLAG_SECUREi usuń wiersz kodu.

Rajesh Shetty
źródło
12

W przypadku użytkowników Java napisz tę linię nad setContentView(R.layout.activity_main);

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

Dla użytkowników kotlin

window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)
user9778021
źródło
w przypadku kotlin, w zależności od kontekstu, powinno tak być, window?.set...ponieważ w Dialogach nie wiesz, czy będziesz mieć okno.
Martin Marconcini
1
Pierwotne pytanie mówiło już, że użyli bezpiecznej flagi, a Twoją odpowiedzią jest użycie bezpiecznej flagi. To tak naprawdę nie odpowiada na opublikowane pytanie.
Subaru Tashiro
10

Wygląda na to, że wiesz, jak wyłączyć zrzuty ekranu z aplikacji i są inne odpowiedzi, które Ci w tym pomogą. Ale postaram się podać kilka ważnych informacji, których nikt Ci nie przekazuje.

1) Nie możesz mieć aplikacji, która jest w 100% zabezpieczona przed wykonywaniem zrzutów ekranu (zdjęcia / wideo). Nie ma oficjalnego sposobu robienia zrzutów ekranu w systemie Android. Jeśli aplikacja nagrywa ekrany, musi używać niektórych nieobsługiwanych metod (rootowania lub korzystania z SDK).

Możesz zablokować aplikację, jeśli używa ona dostępu roota do nagrywania ekranów.

2) Nikt tutaj nie wspomniał o tym problemie, ale należy być bardzo ostrożnym podczas używania WindowManager.LayoutParams.FLAG_SECURE. Na wielu urządzeniach zweryfikowano (jak np. W Samsungu Galaxy ACE, np. GT-S5830), że przez to cały widok jest zakodowany. Lubię to,

wprowadź opis obrazu tutaj

Proszę wystawić taki czek,

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

Działa doskonale na urządzeniach ICS, więc nie ma problemu.

3) Dowiedziałem się również, że nawet na nowszych urządzeniach, takich jak Android 4.3, powoduje to problemy z animacją podczas obracania ekranu. Proszę sprawdzić ten raport o błędzie.

Aritra Roy
źródło
28
nie powinieneś po prostu kopiować i wklejać odpowiedzi innych osób, aby uzyskać głosy. Dodaj także odniesienie do miejsca, z którego skopiowałeś swoją odpowiedź. stackoverflow.com/a/11121897/5437621
mrid
Twoja odpowiedź brzmi: kopiuj i wklej, nie kopiuj i nie wklejaj czyjejś odpowiedzi. masz skopiowaną odpowiedź z linku wymienionego poniżej. stackoverflow.com/a/11121897/5437621
Abdul Basit Rishi
9

Możesz ustawić swoją aplikację jako właściciela urządzenia / profilu i zadzwonić setScreenCaptureDisabled(). W dokumentach ten interfejs API wykonuje następujące czynności:

public void setScreenCaptureDisabled (administrator ComponentName, wartość logiczna wyłączona) Dodano na poziomie API 21

Wywołane przez właściciela urządzenia / profilu w celu określenia, czy przechwytywanie ekranu jest wyłączone. Wyłączenie przechwytywania ekranu zapobiega również wyświetlaniu zawartości na urządzeniach wyświetlających, które nie mają bezpiecznego wyjścia wideo. Zobacz FLAG_SECURE, aby uzyskać więcej informacji na temat bezpiecznych powierzchni i bezpiecznych wyświetlaczy.

Administrator urządzenia dzwoniącego musi być właścicielem urządzenia lub profilu. Jeśli tak nie jest, zostanie zgłoszony wyjątek bezpieczeństwa. Parametry admin Z którym DeviceAdminReceiver jest skojarzone to żądanie. disabled Określa, czy przechwytywanie ekranu jest wyłączone, czy nie.

Alternatywnie możesz zostać partnerem aplikacji MDM (Mobile Device Management). OEM zapewnia dodatkowe interfejsy API do swoich partnerskich aplikacji MDM w celu sterowania urządzeniem. Na przykład firma Samsung udostępnia interfejs API do sterowania nagrywaniem ekranu na urządzeniu swoim partnerom MDM.

Obecnie jest to jedyny sposób, w jaki można wymusić ograniczenia dotyczące przechwytywania ekranu.

rupesh jain
źródło
9

Spróbuj tego:

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
Jithu PS
źródło
3
Pytanie: [quote] Użyłem BEZPIECZNEJ FLAGI [unquote] Twoja „odpowiedź”: [quote] Możesz użyć FLAG_SECURE [unqote] Czy widzisz tutaj problem?
Zobacz
Flaga okna: traktuj zawartość okna jako bezpieczną, zapobiegając wyświetlaniu go na zrzutach ekranu lub wyświetlaniu na niezabezpieczonych wyświetlaczach. Zobacz FLAG_SECURE, aby uzyskać więcej informacji na temat bezpiecznych powierzchni i bezpiecznych wyświetlaczy. Stała wartość: 8192 (0x00002000) Przeczytaj więcej tutaj developer.android.com/reference/android/view/…
Jithu PS
Nie niszcz swojego posta,
wycofując
8

Widziałem wszystkie odpowiedzi, które są odpowiednie tylko dla jednego działania, ale jest moje rozwiązanie, które zablokuje zrzut ekranu dla wszystkich działań bez dodawania kodu do działania. Przede wszystkim utwórz niestandardową klasę aplikacji i dodaj registerActivityLifecycleCallbacks.Następnie zarejestruj ją w swoim manifeście.

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) {
            }
        });
    }



}

Oczywisty

 <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">
Gk Mohammad Emon
źródło
czy to działa we wszystkich przypadkach?
gopalanrc
Wypróbowałem mój projekt, a potem zadziałał dla wszystkich działań. @gopalanrc
Gk Mohammad Emon
2

Zgodnie z tym oficjalnym przewodnikiem , możesz dodać WindowManager.LayoutParams.FLAG_SECUREdo układu okna i uniemożliwi to wykonywanie zrzutów ekranu.

r5d
źródło
2

Użyłem tego rozwiązania, aby umożliwić ręczne tworzenie migawek w aplikacji, jednocześnie uniemożliwiając przechwytywanie ekranu, gdy aplikacja działa w tle, mam nadzieję, że to pomoże.

@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();
}
S.Bozzoni
źródło
0

o zrzut ekranu ze zdjęcia, FLAG_SECURE nie działa zrootowanym urządzeniem.

ale jeśli monitorujesz plik zrzutu ekranu, możesz zapobiec uzyskaniu oryginalnego pliku.

Spróbuj tego jeden .

1. zrzut ekranu monitorowania (monitor plików) za pomocą zdalnej usługi Android
2. usuwanie oryginalnego obrazu zrzutu ekranu.
3. dostarczyć instancję mapy bitowej, aby można było ją modyfikować.

Soo Chun Jung
źródło