是否可以阻止Android应用中的屏幕录制?
我想开发Android安全应用程序。在那里我需要检测运行背景并杀死它们的屏幕录制软件。我使用SECURE FLAG来阻止截图。但我不知道是否有可能阻止Android屏幕的视频捕获。让我知道如何防止屏幕捕获(视频/屏幕截图)。
答案 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)中得到验证,这使整个视图变得混乱。像这样,
请像这样支票,
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