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