Come impedire la cattura dello schermo in Android


118

È possibile impedire la registrazione dello schermo nell'applicazione Android?

Vorrei sviluppare un'applicazione sicura per Android. In questo ho bisogno di rilevare il software di registrazione dello schermo che è in esecuzione in background e ucciderli. Ho usato SECURE FLAG per prevenire screenshot. Ma non so se sia possibile impedire l'acquisizione di video anche dallo schermo Android. Fammi sapere come impedire l'acquisizione dello schermo (video / screenshot).


8
- Dovresti ricordare che si può sempre puntare una telecamera sullo schermo per rubare il contenuto - Ci sono alcune tecniche utilizzate nel campo DRM ma sono piuttosto complesse e non so davvero cosa sta succedendo sotto il cofano
Shai Levy,

9
Il concetto che spiega @ShaiLevy, è solitamente chiamato Analog Hole en.wikipedia.org/wiki/Analog_hole che spiega l'inevitabile buco di sicurezza della trasmissione dei media.
gusridd

Risposte:


126

Dirò che non è possibile impedire completamente l'acquisizione di schermate / video di qualsiasi app Android tramite mezzi supportati. Ma se vuoi bloccarlo solo per i normali dispositivi Android, il SECURE FLAG è sostanziale.

1) Il flag secure blocca sia lo screenshot normale che l'acquisizione video.

Anche la documentazione a questo link lo dice

Flag della finestra: tratta il contenuto della finestra come protetto, impedendo che appaia negli screenshot o venga visualizzato su schermi non protetti.

La soluzione di cui sopra impedirà sicuramente alle applicazioni di acquisire il video della tua app

Vedi la risposta qui .

2) Esistono mezzi alternativi per acquisire il contenuto dello schermo.

Potrebbe essere possibile acquisire lo schermo di un'altra app su un dispositivo rooted o tramite l'SDK,

entrambi offrono poche o nessuna possibilità di bloccarlo o di riceverne una notifica.

Ad esempio: esiste un software per eseguire il mirroring dello schermo del telefono sul computer tramite l'SDK e quindi il software di acquisizione dello schermo potrebbe essere utilizzato lì, non rilevabile dalla tua app.

Vedi la risposta qui .

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

11
oppure si può semplicemente fare clic sull'immagine con la fotocamera palmare.
Ravinder Payal

68

Basta aggiungere questa riga:

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

Prima del tuo setContentView()metodo.


11
Domanda: [quote] Ho usato SECURE FLAG [unquote] La tua "risposta": [quote] Puoi usare FLAG_SECURE [unqote] Riesci a individuare un problema qui?
2Dee

Salve, sto sviluppando un'applicazione per portale basata sul web. Gli utenti possono utilizzare qualsiasi tipo di browser per raggiungere questo portale. Gli utenti di questo portale non devono acquisire gli screenshot quando utilizzano dispositivi mobili. Posso usare le stesse precauzioni (etWindow (). SetFlags (LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);) per l'applicazione web. Funziona per IOS? Se posso utilizzare lo stesso tipo di precauzioni dove devo chiamare questa linea?
Ferda-Ozdemir-Sonmez

24

Per disabilitare Screen Capture:

Aggiungi la seguente riga di codice nel onCreate()metodo:

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

Per abilitare Screen Capture:

Trova LayoutParams.FLAG_SECUREe rimuovi la riga di codice.


12

Per gli utenti Java scrivi questa riga sopra il tuo setContentView(R.layout.activity_main);

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

Per gli utenti di kotlin

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

per kotlin, a seconda del contesto, dovrebbe essere window?.set...perché su Dialogs, non sai se avrai una finestra.
Martin Marconcini

1
La domanda originale diceva già che hanno usato il flag di sicurezza e la tua risposta è usare il flag di sicurezza. Questo in realtà non risponde alla domanda pubblicata.
Subaru Tashiro

10

Sembra che tu sappia come disabilitare gli screenshot dalla tua app e ci sono altre risposte che ti aiutano in questo. Ma cercherò di darti alcune informazioni importanti che nessuno ti sta dando.

1) Non puoi avere un'app che sia sicura al 100% dall'acquisizione di screenshot (foto / video). Non esiste un modo ufficiale per acquisire schermate in Android. Se un'app sta registrando schermate, deve utilizzare alcuni metodi non supportati (rooting o utilizzo dell'SDK).

C'è pochissimo spazio per bloccare un'app se utilizza l'accesso root per registrare le schermate.

2) Nessuno ha menzionato questo problema qui, ma fai molta attenzione durante l'utilizzo WindowManager.LayoutParams.FLAG_SECURE. È stato verificato in molti dispositivi (come su Samsung Galaxy ACE, ad esempio GT-S5830), che questo rende l'intera visualizzazione confusa. Come questo,

inserisci qui la descrizione dell'immagine

Per favore metti un assegno come questo,

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

Funziona perfettamente sui dispositivi ICS, quindi nessun problema.

3) Ho anche scoperto che anche su dispositivi più recenti come Android 4.3, questo causa problemi di animazione quando lo schermo viene ruotato. Si prega di controllare questa segnalazione di bug.


28
non dovresti semplicemente copiare e incollare le risposte di altre persone per ottenere voti. E aggiungi anche un riferimento a dove hai copiato la tua risposta. stackoverflow.com/a/11121897/5437621
mrid

la tua risposta è copia e incolla, per favore non copiare e incollare la risposta di qualcuno. hai copiato questa risposta dalla menzione del link qui sotto. stackoverflow.com/a/11121897/5437621
Abdul Basit Rishi

9

Puoi rendere la tua app come proprietario del dispositivo / profilo e chiamare setScreenCaptureDisabled(). Dai documenti , questa API esegue le seguenti operazioni:

public void setScreenCaptureDisabled (ComponentName admin, boolean disabled) Aggiunto nel livello API 21

Chiamato dal proprietario di un dispositivo / profilo per impostare se l'acquisizione dello schermo è disabilitata. La disabilitazione della cattura dello schermo impedisce anche la visualizzazione del contenuto sui dispositivi di visualizzazione che non dispongono di un'uscita video sicura. Vedi FLAG_SECURE per maggiori dettagli sulle superfici protette e sui display protetti.

L'amministratore del dispositivo chiamante deve essere il proprietario del dispositivo o del profilo. In caso contrario, verrà generata un'eccezione di sicurezza. Parametri admin A quale DeviceAdminReceiver è associata questa richiesta. disabilitato Indica se la cattura dello schermo è disabilitata o meno.

In alternativa, puoi diventare un'app partner MDM (Mobile Device Management). Gli OEM forniscono API aggiuntive alle loro app partner MDM per controllare il dispositivo Ad esempio Samsung fornisce API per controllare la registrazione dello schermo sul dispositivo ai propri partner MDM.

Attualmente questo è l'unico modo per applicare le restrizioni di cattura dello schermo.


9

Prova questo:

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

3
Domanda: [quote] Ho usato SECURE FLAG [unquote] La tua "risposta": [quote] Puoi usare FLAG_SECURE [unqote] Riesci a individuare un problema qui?
2Dee

Flag della finestra: tratta il contenuto della finestra come protetto, impedendo che appaia negli screenshot o venga visualizzato su schermi non protetti. Vedi FLAG_SECURE per maggiori dettagli sulle superfici protette e sui display protetti. Valore costante: 8192 (0x00002000) Ulteriori informazioni da qui developer.android.com/reference/android/view/…
Jithu PS

Per favore non deturpare il tuo post ripristinando i nostri miglioramenti
FelixSFD

8

Ho visto tutte le risposte che sono appropriate solo per una singola attività, ma c'è la mia soluzione che bloccherà lo screenshot per tutte le attività senza aggiungere alcun codice all'attività. Prima di tutto crea una classe di applicazione personalizzata e aggiungi una. registerActivityLifecycleCallbacksQuindi registrala nel tuo 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) {
            }
        });
    }



}

Manifesto

 <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">

funziona in tutti i casi?
gopalanrc

Ho provato il mio progetto poi ha funzionato per tutte le attività. @gopalanrc
Gk Mohammad Emon

2

Secondo questa guida ufficiale , puoi aggiungere WindowManager.LayoutParams.FLAG_SECUREal layout della finestra e non consentirà gli screenshot.


2

Ho usato questa soluzione per consentire l'istantanea manuale nell'app mentre non consentivo l'acquisizione dello schermo quando l'app va in background, spero che aiuti.

@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

sullo screenshot della foto, FLAG_SECURE non funziona sul dispositivo rooted.

ma se controlli il file dello screenshot, puoi impedire di ottenere il file originale.

provare questo uno .

1. Monitoraggio dello screenshot (file monitor) con il servizio remoto Android
2. Elimina l'immagine originale dello screenshot.
3. fornire l'istanza bitmap in modo da poterla modificare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.