如何在Android中防止屏幕捕获


118

是否可以防止在Android应用程序中记录屏幕?

我想开发一个Android安全应用程序。在这种情况下,我需要检测正在后台运行的屏幕录像软件并杀死它们。我已使用SECURE FLAG防止屏幕截图。但我不知道是否有可能也防止Android屏幕的视频捕获。让我知道如何防止屏幕捕获(视频/屏幕截图)。


8
-您应该记住,总可以在屏幕上指点相机来窃取内容-DRM领域中使用了一些技术,但是它们非常复杂,我真的不知道到底发生了什么
Shai Levy

9
@ShaiLevy解释的概念通常称为模拟漏洞en.wikipedia.org/wiki/Analog_hole,它解释了媒体传输不可避免的安全漏洞。
gusridd

Answers:


126

我要说的是,不可能通过受支持的方式完全阻止任何android应用的屏幕/视频捕获。但是如果您只想正常阻止 android设备,则SECURE FLAG非常重要。

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

另外在此链接上的文档说

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

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

这里查看答案。

2)有捕获屏幕内容的替代方法。

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

两者都几乎没有或根本没有机会阻止您或收到通知。

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

这里查看答案。

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

11
或只需用手持摄像机单击图像即可。
Ravinder Payal

68

只需添加以下行:

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

在您的setContentView()方法之前。


11
问题:[quote]我用过SECURE FLAG [unquote]您的“答案”:[quote]您可以用FLAG_SECURE [unqote]在这里可以发现问题吗?
2Dee 2015年

嗨,我正在开发一个基于Web的门户应用程序。用户可以使用任何类型的浏览器访问此门户。该门户网站的用户在使用移动设备时不应获取屏幕截图。我可以对Web应用程序使用相同的预防措施(etWindow()。setFlags(LayoutParams.FLAG_SECURE,LayoutParams.FLAG_SECURE);)。它适用于IOS吗?如果我可以使用相同类型的预防措施,应该在哪里打电话?
Ferda-Ozdemir-Sonmez

23

禁用屏幕捕获:

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

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

要启用屏幕捕获:

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


12

对于Java用户,请在您的 setContentView(R.layout.activity_main);

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

对于Kotlin用户

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

对于kotlin,取决于上下文,这应该是window?.set...因为在Dialogs上,您不知道是否要有Window。
Martin Marconcini

1
最初的问题已经说明他们使用了安全标记,而您的答案是使用安全标记。这并不能真正回答发布的问题。
Subaru Tashiro

10

看来您知道如何禁用应用程序的屏幕截图,还有其他答案可以帮助您。但我会尽力为您提供一些重要信息,而是没人能给您的。

1)您不能拥有100%安全的应用程序以截取屏幕快照(照片/视频)。有没有正式的方式采取截图的Android系统。如果某个应用正在录制屏幕,则它必须使用某些不受支持的方法(生根或使用SDK)。

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

2)这里没有人提到这个问题,但是在使用时要非常小心WindowManager.LayoutParams.FLAG_SECURE。已经在许多设备(例如在Samsung 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,旋转屏幕时也会引起动画问题。请检查此错误报告。


28
您不应该只复制并粘贴其他人的答案以获得选票。并添加对您复制答案的位置的引用。stackoverflow.com/a/11121897/5437621
2017年

您的答案是复制粘贴,请勿复制粘贴他人的答案。您已经从下面的链接中复制了此答案。 stackoverflow.com/a/11121897/5437621
Abdul Basit Rishi

9

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

公共无效setScreenCaptureDisabled(ComponentName admin,禁用布尔值)在API级别21中添加

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

呼叫设备管理员必须是设备或配置文件所有者。如果不是,则会引发安全异常。参数admin此请求与哪个DeviceAdminReceiver关联。已禁用屏幕捕获是否已禁用。

或者,您可以成为MDM(移动设备管理)合作伙伴应用。OEM向其MDM合作伙伴应用提供其他API来控制设备。例如,三星提供api来控制向其MDM合作伙伴显示设备上的屏幕记录。

当前,这是强制执行屏幕捕获限制的唯一方法。


9

试试这个:

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

3
问题:[quote]我用过SECURE FLAG [unquote]您的“答案”:[quote]您可以用FLAG_SECURE [unqote]在这里可以发现问题吗?
2Dee 2015年

窗口标志:将窗口的内容视为安全的,防止其出现在屏幕截图中或在非安全的显示器上查看。有关安全表面和安全显示的更多详细信息,请参见FLAG_SECURE。恒值:8192(0x00002000)更多从这里developer.android.com/reference/android/view/...
Jithu PS

请不要回滚我们的改进来破坏您的帖子
FelixSFD

8

我看到了仅适用于单个活动的所有答案,但是我的解决方案将阻止所有活动的屏幕截图,而无需向活动添加任何代码。首先创建一个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">

在所有情况下都有效吗?
gopalanrc

我尝试过我的项目,然后它适用于所有活动。@gopalanrc
Gk Mohammad Emon

2

根据此官方指南,您可以添加WindowManager.LayoutParams.FLAG_SECURE到窗口布局,这将不允许截图。


2

我使用此解决方案允许在应用程序中进行手动快照,同时在应用程序进入后台时不允许截屏,希望它能有所帮助。

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

0

关于照片的屏幕截图,FLAG_SECURE无法在根目录设备上正常运行。

但是如果您监视屏幕快照文件,则可以防止获取原始文件。

试试这一个

1.使用android远程服务监视屏幕截图(文件监视器)
2.删除原始屏幕快照图像。
3.交付位图实例,以便您可以进行修改。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.