如何防止 Android 中的屏幕捕获

有没有可能阻止 Android 应用程序中的屏幕录制?

我想开发一个 Android 安全应用程序。因此,我需要检测屏幕录音软件正在运行的背景和杀死他们。我已经使用安全标志来防止截屏。但我不知道是否有可能阻止视频捕捉的 Android 屏幕也。让我知道如何防止屏幕捕获(视频/截图)。

204509 次浏览

我要说的是,不可能通过支持的方式完全防止屏幕/视频捕获任何 Android 应用程序。但是,如果你只想阻止它的 正常机器人设备,安全标志是实质性的。

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

这个链接的文件也说

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

上述解决方案将肯定阻止应用程序捕获视频的应用程序

看答案 给你

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

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

这两者都提供很少或根本没有机会,你要么阻止它或接收通知。

例如: 有一些软件可以通过 SDK 将你的手机屏幕镜像到你的计算机上,因此屏幕截图软件可以在那里使用,不会被你的应用程序发现。

看答案 给你

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

只要加上这句话:

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

setContentView()方法之前。

试试这个:

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

你可以让你的应用程序作为设备/配置文件所有者,并调用 setScreenCaptureDisabled():

Public void setScreenCaptureDisable (组件名管理,禁用布尔值) 在 API 级别21中添加

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

调用设备管理员必须是设备或配置文件所有者。如果是 否则,将引发安全性异常 DeviceAdminReceiver 此请求与。禁用是否关联 屏幕截图是否被禁用。

或者你也可以成为 移动设备管理的合作伙伴应用程序。 OEM 为他们的 MDM 合作伙伴应用程序提供额外的 API 来控制设备。例如,三星提供 api 来控制设备上的屏幕录制到其 MDM 合作伙伴。

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

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

禁用屏幕捕获:

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

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

启用屏幕捕获:

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

关于照片截图, FLAG _ SECURE 根设备无法工作。 < br > < br > 但是如果你监视屏幕截图文件,你可以阻止获得原始文件。

试试这个

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

对于 Java 用户 把这一行写在你的 setContentView(R.layout.activity_main);上面

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

给科特林用户的

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

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

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

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

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

Window.SetFlags(WindowManagerFlags.Secure, WindowManagerFlags.Secure);
public class InShotApp extends Application {
    

@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycle();
}
    

private void registerActivityLifecycle() {
    

registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);            }
    

@Override
public void onActivityStarted(@NonNull Activity activity) {
    

}
    

@Override
public void onActivityResumed(@NonNull Activity activity) {
    

}
    

@Override
public void onActivityPaused(@NonNull Activity activity) {
    

}
    

@Override
public void onActivityStopped(@NonNull Activity activity) {
    

}
    

@Override
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {
    

}
    

@Override
public void onActivityDestroyed(@NonNull Activity activity) {
    

}
});
    

}
}

关于阻止在申请中截屏的可能性:

Window window = requireActivity().getWindow();
window.addFlag(WindowManager.LayoutParams.FLAG_SECURE);

记得清理这个标志(onDestroy 中的 f.e)——以便在应用程序的其他安全位置启用屏幕截图:

window.clearFlags(WWindowManager.LayoutParams.FLAG_SECURE);

对于那些不得不禁用截图和使用 Jetpack 的人来说,这是你所需要的:

fun Activity.disableScreenshots() {
window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)
}


fun Activity.enableScreenshots() {
window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
}


@Composable
fun DisableScreenshots() {
val context = LocalContext.current
DisposableEffect(Unit) {
context.getActivity()?.disableScreenshots()
onDispose {
context.getActivity()?.enableScreenshots()
}
}
}

然后从可组合函数中调用 屏幕截图;)