我不希望用户截取或记录我的应用程序的屏幕。我已将安全标志添加到窗口。这可以防止用户截取屏幕截图和录制屏幕。
如果屏幕录制已打开,我的应用程序会阻止录制内容,但会录制音频。
在某些有根设备上,安全标志可能无法按预期工作。 所以我只想检测是否有任何屏幕录制应用程序/进程在后台运行,以便我可以隐藏敏感数据并防止其被记录。
有什么方法可以检测屏幕录制是否打开?
方法可以检测屏幕录制是否打开?
不。
所以我只想检测是否有任何屏幕录制应用程序/进程在后台运行,以便我可以隐藏敏感数据并防止其被记录。
由于屏幕录制不需要特定于录制的应用程序或进程(例如,adb shell screenrecord
),并且由于您无法知道使用媒体投影API的特定应用程序或进程,因此这似乎不切实际。而且,在现代版本的Android上,无论如何,您都无法知道其他进程正在运行。此外,没有什么可以阻止用户将另一个摄像头指向设备屏幕并以这种方式记录其内容。
我不希望用户截取我的应用程序的屏幕截图或录制屏幕
然后不要编写应用程序。FLAG_SECURE
背后的想法是帮助保护用户免受第三方侵害,而不是保护开发人员免受用户的侵害。
这里的答案实际上只是一般的安全。一旦数据流向某人的设备,那么您必须假设他们可以完全、不受限制地访问它。从某种意义上说,其他一切都只是混淆。它充其量只是让它变得更加困难。即使设备的软件提供了一些保护,用户也可以对设备进行物理访问并可以将其植根。在某些时候,数据必须未加密和去混淆,以便可以向用户显示,恶意用户可以对此进行MITM。如果您想要更好的安全性,则需要由设备通过硬件提供。起初,这是电影流式传输到移动设备的一个大问题。设备需要一个特殊的硬件加密通道,每秒解密到一些不敬虔的数据量,如果有人试图将未加密的数据MITM到屏幕上,则很难写回磁盘。
现在以上只是为了表明,当数据进入用户设备时,您无法保证您可以控制数据。相反,你应该退后一步,问问你想完成什么?您要防止哪种类型的行为?如果少数精通技术的用户能够解决您的保护措施,那可以还是大不了?什么是可接受的数据"泄漏"率。这实际上取决于数据的敏感程度以及您告诉用户您对数据的保证类型。这方面是100%最关键的部分。 如果您告诉用户他们发送的数据保证是短暂的,那么这是不可能的。试图建立它并修补所有漏洞并玩打鼹鼠游戏是一场失败的战斗。获胜的唯一方法就是不玩。
正如@CommonsWare所说,没有办法
了解正在使用 媒体投影API,这似乎不切实际。
但是,您可以像这样使用FLAG_SECURE
。
getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
如此处的文档中所述。
我认为有一种方法可以通过DisplayManager.DisplayListener检测屏幕录制
这是我的代码:
val listener = object : DisplayManager.DisplayListener {
override fun onDisplayChanged(displayId: Int) {
Log.d("test","1")
//it detect something chnage in screen
//you can mute it from here
}
override fun onDisplayAdded(displayId: Int) {
Log.d("test","2")
//you can mute it to here from
}
override fun onDisplayRemoved(displayId: Int) {
Log.d("test","3")
//final here you can unMute it
}