For some reasons, we may want to prevent users from taking screenshots of our app. In Android, we can use WindowManager.LayoutParams.FLAG_SECURE to achieve this effect. In the code below, we only need to set WindowManager.LayoutParams.FLAG_SECURE in Activity.onCreate().
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, ) } }
If the user takes a screenshot on the screen with WindowManager.LayoutParams.FLAG_SECURE set, the system will automatically display the message “The app doesn’t allow taking screenshots”.
After setting WindowManager.LayoutParams.FLAG_SECURE, you can also use the code below to clear this flag at any time.
window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
Finally, it should be noted that this WindowManager.LayoutParams.FLAG_SECURE will only affect the current Activity. If you want to prevent screenshots for every Activity, you can set WindowManager.LayoutParams.FLAG_SECURE in ActivityLifecycleCallbacks.onActivityCreated().
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) {} }) } }