如何在Android中阻止屏幕捕获

问题描述 投票:74回答:11

是否可以阻止Android应用程序中的屏幕录制?

我想开发一个Android安全应用程序。在那里我需要检测运行背景并杀死它们的屏幕录制软件。我使用SECURE FLAG来阻止截图。但我不知道是否有可能阻止Android屏幕的视频捕获。让我知道如何防止屏幕捕获(视频/截图)。

android security screenshot snapshot screen-capture
11个回答
87
投票

我要说的是,通过支持的方式完全阻止任何Android应用程序的屏幕/视频捕获是不可能的。但是如果你只是想阻止它用于普通的Android设备,那么SECURE FLAG就是实质性的。

1)安全标志会阻止正常的屏幕截图和视频捕获。

this link的文档也说明了这一点

窗口标志:将窗口内容视为安全,防止它出现在屏幕截图中或防止在非安全显示器上查看。

以上解决方案肯定会阻止应用程序捕获您的应用程序的视频

看到答案here

2)有其他捕获屏幕内容的方法。

可以在root设备上或通过使用SDK捕获另一个应用程序的屏幕,

这两者都很少或根本没有机会阻止它或接收它的通知。

例如:存在通过SDK将手机屏幕镜像到您的计算机的软件,因此可以在那里使用屏幕捕获软件,您的应用程序无法发现。

看到答案here


1
投票

我看到了所有仅适用于单个活动的答案,但我的解决方案将阻止所有活动的屏幕截图,而无需向活动添加任何代码。首先创建一个Custom Application类并添加一个registerActivityLifecycleCallbacks。然后在清单中注册它。

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



}

表现

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

0
投票

关于照片截图,FLAG_SECURE没有使用root设备。 但是如果您监视屏幕截图文件,则可以防止获取原始文件。

试试这个one。 1.使用android远程服务监控屏幕截图(文件监视器) 2.删除原始截图图像。 3.提供位图实例,以便您可以修改。


45
投票

只需添加以下行:

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

在你的setContentView()方法之前。


17
投票

要禁用屏幕捕获:

onCreate()方法中添加以下代码行:

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

要启用屏幕捕获:

找到LayoutParams.FLAG_SECURE并删除代码行。


9
投票

您似乎知道如何从您的应用中禁用屏幕截图,还有其他答案可以帮助您。但我会尽力给你一些没有人给你的重要信息。

1)你不能拥有一个100%安全的应用截图(照片/视频)。 no official way可以在Android中截取屏幕截图。如果某个应用正在录制屏幕,那么它必须使用一些不受支持的方法(生根或使用SDK)。

如果应用程序使用root访问权来记录屏幕,则阻止应用程序的范围很小。

2)这里没有人提到这个问题,但在使用WindowManager.LayoutParams.FLAG_SECURE时要非常小心。它已经在许多设备(例如三星Galaxy ACE,例如GT-S5830)中得到验证,这使整个视图变得混乱。像这样,

请把这样的支票,

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

它在ICS设备上完美运行,所以没问题。

3)我还发现即使在像Android 4.3这样的新设备上,这也会在屏幕旋转时引起动画问题。请check这个错误报告。


9
投票

试试这个:

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

7
投票

您可以将自己的应用设为设备/个人资料所有者,然后致电setScreenCaptureDisabled()。从docs,这个api执行以下操作:

public void setScreenCaptureDisabled(ComponentName admin,boolean disabled)在API级别21中添加

由设备/配置文件所有者调用以设置是否禁用屏幕捕获。禁用屏幕捕获还可以防止内容显示在没有安全视频输出的显示设备上。有关安全曲面和安全显示的更多详细信息,请参阅FLAG_SECURE。

呼叫设备管理员必须是设备或个人资料所有者。如果不是,则抛出安全性异常。参数admin与此请求关联的DeviceAdminReceiver。 disabled是否禁用屏幕捕获。

或者,您可以成为MDM(Mobile Device Management)合作伙伴app.OEMs为其MDM合作伙伴应用程序提供额外的API来控制设备。例如,samsung提供api来控制设备上的屏幕录制到他们的MDM合作伙伴。

目前,这是您可以强制执行屏幕捕获限制的唯一方法。


4
投票

对于Java用户

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

对于kotlin用户

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

2
投票

根据这个official guide,你可以添加WindowManager.LayoutParams.FLAG_SECURE到你的窗口布局,它将禁止截图。


1
投票

我使用此解决方案允许应用程序中的手动快照,同时在应用程序进入后台时禁止屏幕捕获,希望它有所帮助。

@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();
}
© www.soinside.com 2019 - 2024. All rights reserved.