So verhindern Sie die Bildschirmaufnahme in Android

117

Ist es möglich, die Bildschirmaufnahme in der Android-Anwendung zu verhindern?

Ich möchte eine sichere Android-Anwendung entwickeln. Dabei muss ich Bildschirmaufzeichnungssoftware erkennen, auf der Hintergrund ausgeführt wird, und sie töten. Ich habe SECURE FLAG verwendet, um Screenshots zu verhindern. Aber ich weiß nicht, ob es möglich ist, die Videoaufnahme des Android-Bildschirms auch zu verhindern. Lassen Sie mich wissen, wie Sie die Bildschirmaufnahme verhindern können (Video / Screenshots).

Anand
quelle
8
- Sie sollten sich daran erinnern, dass man immer eine Kamera auf den Bildschirm richten kann, um den Inhalt zu stehlen. - Es gibt einige Techniken, die im DRM-Bereich verwendet werden, aber sie sind ziemlich komplex und ich weiß nicht wirklich, was unter der Haube vor sich geht.
Shai Levy
9
Das Konzept, das @ShaiLevy erklärt, wird normalerweise als Analog Hole en.wikipedia.org/wiki/Analog_hole bezeichnet und erklärt die unvermeidliche Sicherheitslücke der Medienübertragung.
Gusridd

Antworten:

126

Ich werde sagen, dass es nicht möglich ist , die Bildschirm- / Videoaufnahme einer Android-App mit unterstützten Mitteln vollständig zu verhindern. Wenn Sie es jedoch nur für normale Android-Geräte blockieren möchten , ist die SICHERE FLAGGE erheblich.

1) Das sichere Flag blockiert sowohl normale Screenshots als auch Videoaufnahmen.

Auch die Dokumentation unter diesem Link sagt das aus

Fensterflag: Behandelt den Inhalt des Fensters als sicher und verhindert , dass er in Screenshots angezeigt oder auf nicht sicheren Anzeigen angezeigt wird.

Die oben genannte Lösung verhindert mit Sicherheit, dass Anwendungen Videos Ihrer App aufnehmen

Siehe die Antwort hier .

2) Es gibt alternative Möglichkeiten zum Erfassen von Bildschirminhalten.

Es kann möglich sein, den Bildschirm einer anderen App auf einem gerooteten Gerät oder mithilfe des SDK zu erfassen.

beide bieten kaum eine Chance, dass Sie es blockieren oder eine Benachrichtigung darüber erhalten.

Beispiel: Es gibt eine Software, mit der Sie den Bildschirm Ihres Telefons über das SDK auf Ihren Computer spiegeln können. Daher kann dort eine Bildschirmaufnahme-Software verwendet werden, die von Ihrer App nicht entdeckt werden kann.

Siehe die Antwort hier .

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
RobCob
quelle
10
oder man kann einfach mit der Handkamera auf das Bild klicken.
Ravinder Payal
68

Fügen Sie einfach diese Zeile hinzu:

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

Vor Ihrer setContentView()Methode.

Ido Naveh
quelle
11
Frage: [quote] Ich habe SECURE FLAG verwendet [unquote] Ihre "Antwort": [quote] Sie können FLAG_SECURE [unqote] verwenden. Können Sie hier ein Problem erkennen?
2Dee
Hallo, ich entwickle eine webbasierte Portalanwendung. Die Benutzer können alle Arten von Browsern verwenden, um dieses Portal zu erreichen. Die Benutzer dieses Portals sollten keine Screenshots machen, wenn sie mobile Geräte verwenden. Kann ich die gleichen Vorsichtsmaßnahmen (etWindow (). SetFlags (LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);) für die Webanwendung verwenden? Funktioniert es für IOS? Wenn ich die gleichen Vorsichtsmaßnahmen treffen kann, wo soll ich diese Leitung anrufen?
Ferda-Ozdemir-Sonmez
22

So deaktivieren Sie die Bildschirmaufnahme:

Fügen Sie der onCreate()Methode folgende Codezeile hinzu :

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

So aktivieren Sie die Bildschirmaufnahme:

Suchen LayoutParams.FLAG_SECUREund entfernen Sie die Codezeile.

Rajesh Shetty
quelle
12

Für Java-Benutzer schreiben Sie diese Zeile über Ihre setContentView(R.layout.activity_main);

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

Für Kotlin-Benutzer

window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)
user9778021
quelle
Für Kotlin sollte dies je nach Kontext daran liegen, dass Sie in Dialogen window?.set...nicht wissen, ob Sie ein Fenster haben werden.
Martin Marconcini
1
Die ursprüngliche Frage besagte bereits, dass sie eine sichere Flagge verwendet haben, und Ihre Antwort lautet, eine sichere Flagge zu verwenden. Dies beantwortet die gestellte Frage nicht wirklich.
Subaru Tashiro
10

Anscheinend wissen Sie, wie Sie Screenshots in Ihrer App deaktivieren können, und es gibt andere Antworten, die Ihnen dabei helfen. Aber ich werde versuchen, Ihnen einige wichtige Informationen zu geben, die Ihnen niemand gibt.

1) Sie können keine App haben, die 100% sicher vor Screenshots (Foto / Video) ist. Es gibt keine offizielle Möglichkeit , Screenshots in Android zu machen. Wenn eine App Bildschirme aufzeichnet, muss sie einige nicht unterstützte Methoden verwenden (entweder Rooting oder SDK).

Es gibt nur sehr wenig Möglichkeiten, eine App zu blockieren, wenn sie Root-Zugriff zum Aufzeichnen von Bildschirmen verwendet.

2) Niemand hat dieses Problem hier erwähnt, aber seien Sie bei der Verwendung sehr vorsichtig WindowManager.LayoutParams.FLAG_SECURE. Bei vielen Geräten (wie beim Samsung Galaxy ACE, z. B. GT-S5830) wurde überprüft, dass dadurch die gesamte Ansicht verschlüsselt wird. So was,

Geben Sie hier die Bildbeschreibung ein

Bitte setzen Sie einen Scheck wie folgt,

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

Es funktioniert perfekt auf ICS-Geräten, also kein Problem.

3) Ich habe auch herausgefunden, dass selbst auf neueren Geräten wie Android 4.3 dies zu Animationsproblemen führt, wenn der Bildschirm gedreht wird. Bitte überprüfen Sie diesen Fehlerbericht.

Aritra Roy
quelle
28
Sie sollten nicht einfach die Antworten anderer kopieren und einfügen, um Stimmen zu erhalten. Fügen Sie außerdem einen Verweis darauf hinzu, von wo Sie Ihre Antwort kopiert haben. stackoverflow.com/a/11121897/5437621
mrid
Ihre Antwort ist Kopieren und Einfügen. Bitte kopieren und fügen Sie keine Antwort ein. Sie haben diese Antwort über den unten angegebenen Link kopiert. stackoverflow.com/a/11121897/5437621
Abdul Basit Rishi
9

Sie können Ihre App als Geräte- / Profilbesitzer erstellen und anrufen setScreenCaptureDisabled(). Aus den Dokumenten geht hervor , dass diese API Folgendes tut:

public void setScreenCaptureDisabled (ComponentName admin, Boolescher Wert deaktiviert) Hinzugefügt in API-Level 21

Wird von einem Geräte- / Profilbesitzer aufgerufen, um festzulegen, ob die Bildschirmaufnahme deaktiviert ist. Durch Deaktivieren der Bildschirmaufnahme wird auch verhindert, dass der Inhalt auf Anzeigegeräten angezeigt wird, die keine sichere Videoausgabe haben. Weitere Informationen zu sicheren Oberflächen und sicheren Anzeigen finden Sie unter FLAG_SECURE.

Der Administrator des aufrufenden Geräts muss ein Geräte- oder Profilbesitzer sein. Ist dies nicht der Fall, wird eine Sicherheitsausnahme ausgelöst. Parameter admin Welchem ​​DeviceAdminReceiver diese Anforderung zugeordnet ist. deaktiviert Gibt an, ob die Bildschirmaufnahme deaktiviert ist oder nicht.

Alternativ können Sie eine MDM- Partner-App (Mobile Device Management) werden. OEMs bieten ihren MDM-Partner-Apps zusätzliche APIs zur Steuerung des Geräts. Beispielsweise bietet Samsung eine API zur Steuerung der Bildschirmaufzeichnung auf dem Gerät für ihre MDM-Partner.

Derzeit ist dies die einzige Möglichkeit, Einschränkungen für die Bildschirmaufnahme durchzusetzen.

Rupesh Jain
quelle
9

Versuche dies:

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
Jithu PS
quelle
3
Frage: [quote] Ich habe SECURE FLAG verwendet [unquote] Ihre "Antwort": [quote] Sie können FLAG_SECURE [unqote] verwenden. Können Sie hier ein Problem erkennen?
2Dee
Fensterflag: Behandelt den Inhalt des Fensters als sicher und verhindert, dass er in Screenshots angezeigt oder auf nicht sicheren Anzeigen angezeigt wird. Weitere Informationen zu sicheren Oberflächen und Anzeigen finden Sie unter FLAG_SECURE. Konstanter Wert: 8192 (0x00002000) Lesen Sie mehr von hier developer.android.com/reference/android/view/…
Jithu PS
Bitte verunstalten Sie Ihren Beitrag nicht, indem Sie unsere Verbesserungen
zurücksetzen
7

Ich habe alle Antworten gesehen, die nur für eine einzelne Aktivität geeignet sind, aber es gibt meine Lösung, die Screenshots für alle Aktivitäten blockiert, ohne der Aktivität Code hinzuzufügen. registerActivityLifecycleCallbacksErstellen Sie zunächst eine benutzerdefinierte Anwendungsklasse und fügen Sie eine hinzu. Registrieren Sie sie dann in Ihrem Manifest.

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



}

Manifest

 <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
quelle
funktioniert es in allen Fällen?
Gopalanrc
Ich habe mein Projekt ausprobiert, dann hat es für alle Aktivitäten funktioniert. @gopalanrc
Gk Mohammad Emon
2

Laut dieser offiziellen Anleitung können Sie WindowManager.LayoutParams.FLAG_SECUREIhr Fensterlayout erweitern und es werden keine Screenshots angezeigt.

r5d
quelle
2

Ich habe diese Lösung verwendet, um manuelle Schnappschüsse in der App zuzulassen, während die Bildschirmaufnahme im Hintergrund der App nicht zulässig ist. Ich hoffe, sie hilft.

@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
quelle
0

Über Foto-Screenshot, FLAG_SECURE funktioniert nicht gerootetes Gerät.

Wenn Sie jedoch die Screenshot-Datei überwachen, können Sie verhindern, dass die Originaldatei abgerufen wird.

versuchen , diese ein .

1. Screenshot (Dateimonitor) mit Android Remote Service überwachen
2. Original-Screenshot löschen.
3. Stellen Sie die Bitmap-Instanz bereit, damit Sie sie ändern können.

Soo Chun Jung
quelle