基於一些理由,我們可能會想要禁止使用者對我們的 app 做螢幕截圖。在 Android 中,我們可以用 WindowManager.LayoutParams.FLAG_SECURE 來達到此效果。在下方的程式碼中,我們只要在 Activity.onCreate() 中設定 WindowManager.LayoutParams.FLAG_SECURE 即可。
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) window.setFlags( WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE, ) } }
若使用者在有設定 WindowManager.LayoutParams.FLAG_SECURE 的畫面上做螢幕截圖的話,系統會自動顯示「基於安全性原則,無法拍攝截圖」的訊息。
在設定好 WindowManager.LayoutParams.FLAG_SECURE 之後,你也可以隨時用下方的程式碼來清除此 flag。
window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
最後,要注意的是,此 WindowManager.LayoutParams.FLAG_SECURE 只會影響當前的 Activity。如果你想要每一個 Activity 都禁止截圖的話,你可以在 ActivityLifecycleCallbacks.onActivityCreated() 中設定 WindowManager.LayoutParams.FLAG_SECURE。
class MyApplication : Application() { override fun onCreate() { super.onCreate() registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks { override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { activity.window.setFlags( WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE ) } override fun onActivityStarted(activity: Activity) {} override fun onActivityResumed(activity: Activity) {} override fun onActivityPaused(activity: Activity) {} override fun onActivityStopped(activity: Activity) {} override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} override fun onActivityDestroyed(activity: Activity) {} }) } }