如何在Android中阻止屏幕捕获

Ana*_*and 90 security android screenshot snapshot screen-capture

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

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

小智 96

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

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

此链接上的文档也说明了一点

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

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

这里看到答案.

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

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

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

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

这里看到答案.

  • 或者只需用手持相机点击图像即可. (7认同)
  • 小提示 `WindowManager.LayoutParams.FLAG_SECURE` 是完整签名,因为有多个 LayoutParams (3认同)

Ido*_*veh 52

只需添加以下行:

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
Run Code Online (Sandbox Code Playgroud)

在你的setContentView()方法之前.

  • 问题:[quote]我用过SECURE FLAG [unquote]你的"回答":[quote]你可以用FLAG_SECURE [unqote]你能在这里发现问题吗? (3认同)
  • setContentView() 之前无需执行此操作 (2认同)

小智 19

要禁用屏幕捕获:

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

getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
                           WindowManager.LayoutParams.FLAG_SECURE);
Run Code Online (Sandbox Code Playgroud)

要启用屏幕捕获:

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


Gk *_*mon 19

我看到了所有仅适用于单个活动的答案,但我的解决方案将阻止所有活动的屏幕截图,而无需向活动添加任何代码。首先创建一个自定义应用程序类并添加一个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) {
            }
        });
    }



}
Run Code Online (Sandbox Code Playgroud)

显现

 <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">
Run Code Online (Sandbox Code Playgroud)

  • 非常好的解决方案...它的通用方式..酷 (3认同)

Jit*_*P.S 10

试试这个:

getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
Run Code Online (Sandbox Code Playgroud)

  • 问题:[quote]我用过SECURE FLAG [unquote]你的"回答":[quote]你可以用FLAG_SECURE [unqote]你能在这里发现问题吗? (3认同)

Ari*_*Roy 9

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

1)你不能拥有一个100%安全的应用截图(照片/视频).有没有正式的方式采取截图的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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 你不应该只是复制和粘贴其他人获得投票的答案.并添加对您复制答案的位置的引用./sf/answers/778532821/ (22认同)

S.B*_*oni 8

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

@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();
}
Run Code Online (Sandbox Code Playgroud)


rup*_*ain 7

您可以将自己的应用设为设备/个人资料所有者并致电setScreenCaptureDisabled().从 文档中,这个api执行以下操作:

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

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

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

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

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


小智 6

对于Java用户

getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
Run Code Online (Sandbox Code Playgroud)

对于Kotlin用户

window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)
Run Code Online (Sandbox Code Playgroud)