如何在Android中阻止屏幕捕获

时间:2015-02-19 12:40:25

标签: android security screenshot snapshot screen-capture

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

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

13 个答案:

答案 0 :(得分:82)

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

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

  

this link上的文档也说明了

     
    

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

  
     

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

请参阅答案here

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

可以在有根设备上或通过使用SDK

捕获另一个应用的屏幕
  

它们几乎没有机会阻止它或接收它的通知。

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

请参阅答案here

答案 1 :(得分:42)

只需添加以下行:

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

setContentView()方法之前。

答案 2 :(得分:15)

禁用屏幕捕获:

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

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

启用屏幕捕获:

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

答案 3 :(得分:9)

试试这个:

<li>

答案 4 :(得分:9)

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

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

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

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

enter image description here

请像这样支票,

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此错误报告。

答案 5 :(得分:7)

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

  

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

     

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

     

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

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

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

答案 6 :(得分:3)

对于Java用户

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

针对Kotlin用户

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

答案 7 :(得分:1)

根据此official guide,您可以将WindowManager.LayoutParams.FLAG_SECURE添加到您的窗口布局中,它将禁止截屏。

答案 8 :(得分: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();
}

答案 9 :(得分: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">

答案 10 :(得分:0)

关于照片截图, FLAG_SECURE没有使用root设备。

但如果您监控屏幕截图文件,则可以防止获取原始文件。

试试这个one

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

答案 11 :(得分:0)

在MainActivity(Xamarin)的OnCreate事件中将此行添加为

Window.SetFlags(WindowManagerFlags.Secure, WindowManagerFlags.Secure);

答案 12 :(得分:0)

DIO