Skip to main content

Preventing Screenshots

It is possible in some cases to prevent user from taking screenshots of your Android application.

Limitation​

This method cannot prevent all kinds of screenshot taking methods. Here's a table summarizing the limitation of this method:

Screenshot MethodSpecific MethodCan be prevented?
Hardware button presses✅
With emulator⛔️
With logcat✅
With Android Debug Bridge (adb)screencap command✅
KEYCODE_SYSRQ keyevent✅
Programmatically⛔️
Within instrumented testingDeviceCapture API✅
captureToImage or captureToBitmap API⛔️

Basic Usage​

The key component to preventing screenshots is WindowManager.LayoutParams.FLAG_SECURE flag. You only need to add this flag to your Activity to prevent users from taking screenshots.

Below is a simple utility file that we can use:

SimpleScreenshotUtil.kt
package com.hanmajid.androidnotebook

import android.view.Window
import android.view.WindowManager

/**
* Screenshot-related utility object.
*/
object SimpleScreenshotUtil {

/**
* Returns true if [window] is currently protected from screenshot.
*/
fun isScreenshotPreventionEnabled(window: Window): Boolean {
return (window.attributes.flags and WindowManager.LayoutParams.FLAG_SECURE) != 0
}

/**
* Enable screenshot prevention on [window].
*/
fun enableScreenshotPrevention(window: Window) {
window.setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE,
)
}

/**
* Disable screenshot prevention on [window].
*/
fun disableScreenshotPrevention(window: Window) {
window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
}
}

Here's an example of using the utility object in a simple Activity:

MainActivity.kt
package com.hanmajid.androidnotebook

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.hanmajid.androidnotebook.ui.theme.MyApplicationTheme

class MainActivity : ComponentActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

// Enable screenshot prevention on this Activity.
if (!SimpleScreenshotUtil.isScreenshotPreventionEnabled(window)) {
SimpleScreenshotUtil.enableScreenshotPrevention(window)
}

setContent {
MyApplicationTheme {
// A surface container using the 'background' color from the theme
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
Greeting("Android")
}
}
}
}
}

@Composable
fun Greeting(name: String, modifier: Modifier = Modifier) {
Text(
text = "Hello $name!",
modifier = modifier
)
}

@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
MyApplicationTheme {
Greeting("Android")
}
}

You can test this method by trying to take a screenshot of this Activity.

References​