在 Android 12 上,如果我使用
WindowManager.LayoutParams.FLAG_SECURE
创建一个简单的应用程序
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
window.setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE
)
setContentView(R.layout.activity_main)
}
}
如果我尝试切换应用程序,窗口不安全
但是,如果我切换回去,窗户就会安全
在这两种情况下,切换到或退出时,窗口在 Android 11 上都是安全的,但在 Android 12 上则不然。知道为什么吗?
在您的活动中使用
View#onWindowFocusChanged(boolean)
的简单方法:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
// allow screenshots when activity is focused
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
} else {
// hide information (blank view) on app switcher
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
}
}
从 Android 版本 12 开始,这是理想的行为。此外,您可以查看 Google 问题跟踪器。
https://issuetracker.google.com/issues/237190495
我们可以使用 onPause 和 onResume 来代替 onWindowFocusChanged(boolean)。当 Activity 没有焦点时,我们 当应用程序重新获得焦点时,可以启用 FLAG_SECURE 我们可以清除 标志_安全
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
if (hasFocus) {
window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
} else {
window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)
}
}
Android 13 中添加了一个新标志,以防止应用预览出现在“最近使用的应用”中。 https://developer.android.com/reference/android/app/Activity#setRecentsScreenshotEnabled(布尔值) 虽然这不适用于 Android 12,但我在这里分享给对此功能感兴趣的人。