无法使用 WindowManager.LayoutParams.FLAG_SECURE 保护 Android 12 上的窗口

问题描述 投票:0回答:3

在 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 上则不然。知道为什么吗?

android android-windowmanager
3个回答
3
投票

在您的活动中使用

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

2
投票

从 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)
       }
}

0
投票

Android 13 中添加了一个新标志,以防止应用预览出现在“最近使用的应用”中。 https://developer.android.com/reference/android/app/Activity#setRecentsScreenshotEnabled(布尔值) 虽然这不适用于 Android 12,但我在这里分享给对此功能感兴趣的人。

© www.soinside.com 2019 - 2024. All rights reserved.