Como evitar a captura de tela no Android

118

É possível evitar a gravação de tela no aplicativo Android?

Gostaria de desenvolver um aplicativo seguro para Android. Para isso, preciso detectar o software de gravação de tela que está executando em segundo plano e eliminá-los. Usei SECURE FLAG para evitar capturas de tela. Mas não sei se é possível impedir a captura de vídeo da tela do Android também. Deixe-me saber como evitar a captura de tela (vídeo / screenshots).

Anand
fonte
8
- Você deve se lembrar que sempre é possível apontar uma câmera na tela para roubar o conteúdo - Existem algumas técnicas usadas no campo DRM, mas elas são muito complexas e eu realmente não sei o que está acontecendo por baixo do capô
Shai Levy
9
O conceito que @ShaiLevy explica, é geralmente chamado de Analog Hole en.wikipedia.org/wiki/Analog_hole que explica a falha de segurança inevitável da transmissão de mídia.
gusridd de

Respostas:

126

Vou dizer que não é possível impedir completamente a captura de tela / vídeo de qualquer aplicativo Android através dos meios suportados. Mas se você deseja bloqueá-lo apenas para dispositivos Android normais , o SECURE FLAG é substancial.

1) O sinalizador seguro bloqueia tanto a captura de tela normal quanto a captura de vídeo.

Também a documentação neste link diz que

Sinalizador de janela: trate o conteúdo da janela como seguro, evitando que apareça em capturas de tela ou seja visualizado em telas não seguras.

A solução acima certamente impedirá que os aplicativos capturem vídeo do seu aplicativo

Veja a resposta aqui .

2) Existem meios alternativos de captura do conteúdo da tela.

Pode ser possível capturar a tela de outro aplicativo em um dispositivo com acesso root ou por meio do SDK,

que oferecem pouca ou nenhuma chance de você bloqueá-lo ou receber uma notificação sobre ele.

Por exemplo: existe um software para espelhar a tela do seu telefone para o seu computador através do SDK e, portanto, o software de captura de tela pode ser usado lá, não detectável pelo seu aplicativo.

Veja a resposta aqui .

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
RobCob
fonte
11
ou pode-se simplesmente clicar na imagem com a câmera de mão.
Ravinder Payal
68

Basta adicionar esta linha:

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

Antes de seu setContentView()método.

Ido Naveh
fonte
11
Pergunta: [quote] Eu usei SECURE FLAG [unqote] Sua "resposta": [quote] Você pode usar FLAG_SECURE [unqote] Você consegue identificar um problema aqui?
2Dee
Olá, estou desenvolvendo um aplicativo de portal baseado na web. Os usuários podem utilizar qualquer tipo de navegador para chegar a este portal. Os usuários deste portal não devem fazer as capturas de tela quando estiverem usando dispositivos móveis. Posso usar as mesmas precauções (etWindow (). SetFlags (LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);) para o aplicativo da web. Isso funciona para IOS? Se eu puder usar o mesmo tipo de precauções, para onde devo ligar para esta linha?
Ferda-Ozdemir-Sonmez,
24

Para desativar a captura de tela:

Adicione a seguinte linha de código no onCreate()método:

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

Para ativar a captura de tela:

Encontre LayoutParams.FLAG_SECUREe remova a linha de código.

Rajesh Shetty
fonte
12

Para usuários Java, escreva esta linha acima de seu setContentView(R.layout.activity_main);

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

Para usuários do kotlin

window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)
user9778021
fonte
para o kotlin, dependendo do contexto, deve ser window?.set...porque no Dialogs você não sabe se vai ter uma janela.
Martin Marconcini
1
A pergunta original já dizia que eles usaram sinalizador seguro e sua resposta é usar sinalizador seguro. Isso realmente não responde à pergunta postada.
Subaru Tashiro
10

Parece que você sabe como desabilitar as capturas de tela do seu aplicativo e há outras respostas que o ajudam nisso. Mas vou tentar dar-lhe algumas informações importantes que ninguém está lhe dando.

1) Você não pode ter um aplicativo que seja 100% seguro contra capturas de tela (foto / vídeo). Não existe uma maneira oficial de fazer capturas de tela no Android. Se um aplicativo estiver gravando telas, ele deve estar usando alguns métodos não suportados (enraizamento ou usando o SDK).

Há muito pouco espaço para você bloquear um aplicativo se ele estiver usando o acesso root para gravar telas.

2) Ninguém mencionou esse problema aqui, mas tenha muito cuidado ao usar WindowManager.LayoutParams.FLAG_SECURE. Foi verificado em muitos dispositivos (como no Samsung Galaxy ACE, por exemplo, GT-S5830), que isso torna a visão inteira embaralhada. Como isso,

insira a descrição da imagem aqui

Por favor, coloque um cheque como este,

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

Funciona perfeitamente em dispositivos ICS, então não há problema nisso.

3) Também descobri que mesmo em dispositivos mais novos como o Android 4.3, isso causa problemas de animação quando a tela é girada. Por favor, verifique este relatório de bug.

Aritra Roy
fonte
28
você não deve apenas copiar e colar as respostas de outras pessoas para obter votos. E também adicione uma referência de onde você copiou sua resposta. stackoverflow.com/a/11121897/5437621
março de
sua resposta é copiar e colar, por favor, não copie e cole a resposta de alguém. você copiou esta resposta do link abaixo. stackoverflow.com/a/11121897/5437621
Abdul Basit Rishi
9

Você pode fazer seu aplicativo como proprietário do dispositivo / perfil e ligar setScreenCaptureDisabled(). A partir dos documentos , esta api faz o seguinte:

public void setScreenCaptureDisabled (ComponentName admin, boolean disabled) Adicionado na API de nível 21

Chamado por um proprietário de dispositivo / perfil para definir se a captura de tela está desativada. Desativar a captura de tela também evita que o conteúdo seja mostrado em dispositivos de exibição que não possuem uma saída de vídeo segura. Consulte FLAG_SECURE para obter mais detalhes sobre superfícies seguras e monitores seguros.

O administrador do dispositivo de chamada deve ser um proprietário do dispositivo ou perfil. Se não for, uma exceção de segurança será lançada. Parâmetros admin Com qual DeviceAdminReceiver esta solicitação está associada. desativado Se a captura de tela está desativada ou não.

Como alternativa, você pode se tornar um aplicativo parceiro MDM (Gerenciamento de dispositivo móvel ) .OEMs fornece APIs adicionais para seus aplicativos parceiros MDM para controlar o dispositivo. Por exemplo, a samsung fornece api para controlar a gravação de tela no dispositivo para seus parceiros MDM.

Atualmente, esta é a única maneira de impor restrições de captura de tela.

Rupesh Jain
fonte
9

Experimente isto:

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
Jithu PS
fonte
3
Pergunta: [quote] Eu usei SECURE FLAG [unqote] Sua "resposta": [quote] Você pode usar FLAG_SECURE [unqote] Você consegue identificar um problema aqui?
2Dee
Sinalizador de janela: trate o conteúdo da janela como seguro, evitando que apareça em capturas de tela ou seja visualizado em telas não seguras. Consulte FLAG_SECURE para obter mais detalhes sobre superfícies seguras e monitores seguros. Valor constante: 8192 (0x00002000) Leia mais aqui developer.android.com/reference/android/view/…
Jithu PS
Não desfigurar sua postagem
revertendo
8

Eu vi todas as respostas que são apropriadas apenas para uma única atividade, mas há minha solução que irá bloquear a captura de tela para todas as atividades sem adicionar nenhum código à atividade. Em primeiro lugar, crie uma classe de aplicativo personalizado e adicione um. registerActivityLifecycleCallbacksDepois, registre-o em seu manifesto.

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">
Gk Mohammad Emon
fonte
funciona em todos os casos?
gopalanrc
Experimentei do meu projeto então funcionou para todas as atividades. @gopalanrc
Gk Mohammad Emon
2

De acordo com este guia oficial , você pode adicionar WindowManager.LayoutParams.FLAG_SECUREao layout da janela e não permitirá as capturas de tela.

r5d
fonte
2

Usei essa solução para permitir o instantâneo manual no aplicativo e, ao mesmo tempo, proibir a captura de tela quando o aplicativo entra em segundo plano, espero que ajude.

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

sobre a captura de tela da foto, FLAG_SECURE não funciona no dispositivo com acesso root.

mas se você monitorar o arquivo de captura de tela, pode impedir de obter o arquivo original.

tente este um .

1. monitorando a captura de tela (monitor de arquivo) com o serviço remoto Android
2. Exclua a imagem da captura de tela original.
3. entregar a instância do bitmap para que você possa modificar.

Soo Chun Jung
fonte