📜  如何防止Android中的屏幕截图或屏幕录像机?

📅  最后修改于: 2021-05-10 15:52:14             🧑  作者: Mango

在某些情况下,我们不想允许截取我们的android应用程序的屏幕截图或屏幕录像。在这里,我们将说明当应用程序进入后台时如何防止Android截屏或截屏。通常,当我们截取屏幕截图时,我们会在通知栏中看到“屏幕捕获”通知,如果您单击该通知,则可以在“图库”应用程序中看到该屏幕截图。在某些Android应用程序中,由于开发者保护的屏幕,我们无法对可见屏幕进行截图。在这种情况下,我们会在屏幕上的通知栏或Toast中看到该消息。一些付款转账应用程序或包含课程的应用程序具有此功能。在本文中,我们将创建一个简单的项目来演示此功能的工作原理。下面给出了一个示例GIF,以了解我们将在本文中做些什么。注意,我们将使用Java语言实现该项目。

分步实施

步骤1:创建一个新项目

要在Android Studio中创建新项目,请参阅如何在Android Studio中创建/启动新项目。请注意,选择Java作为编程语言。

步骤2:使用activity_main.xml文件

导航到应用程序> res>布局> activity_main.xml,然后将以下代码添加到该文件中。以下是activity_main.xml文件的代码。我们将在activity_main.xml文件中创建一个简单的TextView。

XML


  
    
  


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


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


方法1

MainActivity中。 Java文件只需添加以下代码,它将阻止在Android App中获取截屏。

以下是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:将其注册到清单文件中,如下所示


        
            
                

                
            
        
    

输出:

在这里,您可以清楚地看到它既不允许截屏也不能截屏,因为当我们尝试截屏时,它会变黑。