是否可以防止在Android应用程序中记录屏幕?
我想开发一个Android安全应用程序。在这种情况下,我需要检测正在后台运行的屏幕录像软件并杀死它们。我已使用SECURE FLAG防止屏幕截图。但我不知道是否有可能也防止Android屏幕的视频捕获。让我知道如何防止屏幕捕获(视频/屏幕截图)。
是否可以防止在Android应用程序中记录屏幕?
我想开发一个Android安全应用程序。在这种情况下,我需要检测正在后台运行的屏幕录像软件并杀死它们。我已使用SECURE FLAG防止屏幕截图。但我不知道是否有可能也防止Android屏幕的视频捕获。让我知道如何防止屏幕捕获(视频/屏幕截图)。
Answers:
我要说的是,不可能通过受支持的方式完全阻止任何android应用的屏幕/视频捕获。但是如果您只想正常阻止 android设备,则SECURE FLAG非常重要。
1)安全标志确实阻止正常的屏幕截图和视频捕获。
另外在此链接上的文档说
窗口标志:将窗口的内容视为安全的,防止其出现在屏幕截图中或在非安全的显示器上查看。
上述解决方案肯定会阻止应用捕获您应用的视频
在这里查看答案。
2)有捕获屏幕内容的替代方法。
可以在有根设备上或通过使用SDK捕获另一个应用程序的屏幕,
两者都几乎没有或根本没有机会阻止您或收到通知。
例如:存在用于通过SDK将手机屏幕镜像到计算机的软件,因此可以在其中使用屏幕捕获软件,而应用程序无法发现该软件。
在这里查看答案。
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
只需添加以下行:
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
在您的setContentView()
方法之前。
禁用屏幕捕获:
在onCreate()
方法中添加以下代码行:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE);
要启用屏幕捕获:
查找LayoutParams.FLAG_SECURE
并删除代码行。
对于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)
window?.set...
因为在Dialogs上,您不知道是否要有Window。
看来您知道如何禁用应用程序的屏幕截图,还有其他答案可以帮助您。但我会尽力为您提供一些重要信息,而是没人能给您的。
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,旋转屏幕时也会引起动画问题。请检查此错误报告。
您可以将应用设为设备/个人资料所有者,然后致电setScreenCaptureDisabled()
。在 docs中,此api执行以下操作:
公共无效setScreenCaptureDisabled(ComponentName admin,禁用布尔值)在API级别21中添加
由设备/配置文件所有者调用以设置是否禁用屏幕截图。禁用屏幕捕获还会阻止内容显示在没有安全视频输出的显示设备上。有关安全表面和安全显示的更多详细信息,请参见FLAG_SECURE。
呼叫设备管理员必须是设备或配置文件所有者。如果不是,则会引发安全异常。参数admin此请求与哪个DeviceAdminReceiver关联。已禁用屏幕捕获是否已禁用。
或者,您可以成为MDM(移动设备管理)合作伙伴应用。OEM向其MDM合作伙伴应用提供其他API来控制设备。例如,三星提供api来控制向其MDM合作伙伴显示设备上的屏幕记录。
当前,这是强制执行屏幕捕获限制的唯一方法。
试试这个:
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
我看到了仅适用于单个活动的所有答案,但是我的解决方案将阻止所有活动的屏幕截图,而无需向活动添加任何代码。首先创建一个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">
我使用此解决方案允许在应用程序中进行手动快照,同时在应用程序进入后台时不允许截屏,希望它能有所帮助。
@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();
}