Screen Capture Event Plus

A Flutter plugin to detect and handle screen capture events (Screenshots & Screen Recording) for both Android and iOS. It also supports securing screens by preventing screenshots on Android and applying screen blur overlays on iOS during recording.

Features

  • Screenshot Detection: Listen for screenshot events on Android (including native Android 14+ ScreenCaptureCallback) and iOS.
  • Screen Recording Detection: Detect when the user starts or stops screen recording (Android & iOS).
  • Screenshot & Recording Protection: Secure app content with FLAG_SECURE on Android and dynamic blur overlay protection on iOS when screen recording is detected.
  • Multiple & Granular Listeners: Attach and detach callbacks (addScreenShotListener, removeScreenShotListener, etc.) easily.
  • Low Overhead & Safe Execution: Offloads heavy filesystem operations to background threads on Android and uses Swift Package Manager (SPM) on iOS.

Installation

Run this command with Flutter:

flutter pub add screen_capture_event_plus

Or add it manually to your pubspec.yaml dependencies:

dependencies:
  screen_capture_event_plus: ^1.3.0

Platform Configuration

iOS

  • Supports Swift Package Manager (SPM) and requires a minimum iOS deployment target of 13.0.
  • Ensure your iOS project's deployment target is set to 13.0 or higher in Xcode.

Android

  • Uses Activity.ScreenCaptureCallback on Android 14 (API 34)+ for permissionless screenshot detection.
  • Automatically requests READ_MEDIA_IMAGES on Android 13 (Tiramisu) and READ_EXTERNAL_STORAGE on older Android versions when required.
  • Ensure your Android minSdkVersion is at least 23 (Android 6.0).

Usage

1. Initialize and Watch for Events

Instantiate the listener, register your callbacks, and start watching for capture events in your stateful widget:

import 'package:screen_capture_event_plus/screen_capture_event_plus.dart';

class _MyScreenState extends State<MyScreen> {
  final ScreenCaptureEvent screenListener = ScreenCaptureEvent();
  String statusText = "Listening for events...";

  void _onRecord(bool recorded) {
    setState(() {
      statusText = recorded ? "Screen Recording Started" : "Screen Recording Stopped";
    });
  }

  void _onScreenshot(String filePath) {
    setState(() {
      statusText = "Screenshot detected! Path: $filePath";
    });
  }

  @override
  void initState() {
    super.initState();

    // 1. Listen for screen recording events (Android & iOS)
    screenListener.addScreenRecordListener(_onRecord);

    // 2. Listen for screenshot events
    screenListener.addScreenShotListener(_onScreenshot);

    // 3. Start observing events
    screenListener.watch();
  }

  @override
  void dispose() {
    // Optionally remove individual listeners or call dispose() to clean up native observers
    screenListener.removeScreenRecordListener(_onRecord);
    screenListener.removeScreenShotListener(_onScreenshot);
    screenListener.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(child: Text(statusText)),
    );
  }
}

2. Prevent Screenshots & Secure Screen Content

To secure the screen content from screenshots and recording:

// Enable screenshot & recording protection (FLAG_SECURE on Android, blur overlay on iOS)
screenListener.preventScreenCapture(true);

// Disable screen protection
screenListener.preventScreenCapture(false);

Credits & Acknowledgments

This package is an enhanced version based on the original screen_capture_event package created by Nizwar.