Как предотвратить снимок экрана или запись экрана в Android?

Опубликовано: 2 Сентября, 2022

В некоторых ситуациях мы не хотим разрешать делать снимки экрана или записи экрана нашего приложения для Android. Здесь мы собираемся объяснить, как запретить Android делать снимок экрана или запись экрана, когда приложение переходит в фоновый режим. Как правило, когда мы делаем снимок экрана, мы видим уведомление о снимке экрана на панели уведомлений, и вы можете увидеть этот снимок экрана в приложении «Галерея», если щелкнете по этому уведомлению. И в некоторых приложениях для Android мы не можем сделать скриншот видимого экрана из-за того, что экран защищен разработчиком. В этой ситуации мы увидим сообщение в панели уведомлений или в Toastover на экране. Эта функция есть в некоторых приложениях для перевода платежей или приложениях, содержащих курсы. В этой статье мы создадим простой проект, чтобы продемонстрировать, как работает эта функция. Образец GIF приведен ниже, чтобы получить представление о том, что мы собираемся делать в этой статье. Обратите внимание, что мы собираемся реализовать этот проект на языке Java .

Пошаговая реализация

Шаг 1: Создайте новый проект

Чтобы создать новый проект в Android Studio, обратитесь к разделу «Как создать/запустить новый проект в Android Studio». Обратите внимание, что в качестве языка программирования выберите Java .

Шаг 2: Работа с файлом activity_main.xml

Перейдите к приложению > res > layout > activity_main.xml и добавьте приведенный ниже код в этот файл. Ниже приведен код файла activity_main.xml . Мы создадим простой TextView внутри файла activity_main.xml .

XML




<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Preventing App from Taking Screenshot"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        android:textStyle="bold"
        android:textSize="18sp"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
 
</androidx.constraintlayout.widget.ConstraintLayout>


Способ 1

В файле MainActivity.java просто добавьте следующий код, и это предотвратит создание снимков экрана в приложении Android.

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

                                  WindowManager.LayoutParams.FLAG_SECURE);

Ниже приведен полный код файла MainActivity.java .

Java




import androidx.appcompat.app.AppCompatActivity;
 
import android.os.Bundle;
import android.view.WindowManager;
 
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        // Adding this line will prevent taking screenshot in your app
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
                             WindowManager.LayoutParams.FLAG_SECURE);
        
    }
}


Способ 2

Метод 1 подходит только для одного действия, но какое решение для блочного снимка экрана для всех действий. Мы собираемся обсудить это в методе 2. Прежде всего, создайте класс Custom Application и добавьте registerActivityLifecycleCallbacks . Затем зарегистрируйте его в своем манифесте.

Шаг 1: Здесь напишите данный код в файле MyApplicationContext.java.

Java




import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.os.Bundle;
import android.view.WindowManager;
 
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) {
            }
        });
    }
}

Шаг 2. Зарегистрируйте его в файле манифеста следующим образом.

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:name=".MyApplicationContext"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

Выход:

Здесь вы можете ясно видеть, что он не позволяет делать снимки экрана или записывать экран, поскольку, когда мы пытаемся сделать запись экрана, он становится черным.