Как предотвратить снимок экрана или запись экрана в Android?
В некоторых ситуациях мы не хотим разрешать делать снимки экрана или записи экрана нашего приложения для 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 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>
Выход:
Здесь вы можете ясно видеть, что он не позволяет делать снимки экрана или записывать экран, поскольку, когда мы пытаемся сделать запись экрана, он становится черным.