You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter如何实现仅对单个页面禁止屏幕录制或截屏

Flutter单页面禁止录屏/截屏实现方案

核心思路是通过MethodChannel实现Flutter与原生侧的动态通信,在指定页面进入时开启防录屏限制,页面销毁时关闭限制,避免全局生效。


1. 通用逻辑说明

  • 无需做全局原生配置,完全通过页面生命周期触发限制开关
  • 统一注册跨端通信通道,暴露两个原生方法:enableSecureScreen(开启防录屏截屏)、disableSecureScreen(关闭限制)

2. Android 侧实现

打开项目中android/app/src/main/kotlin/包名路径/MainActivity.kt,添加如下代码:

import android.view.WindowManager
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity : FlutterActivity() {
    // 通道名需和Flutter侧完全一致
    private val CHANNEL = "com.example.screen_secure/channel"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            when (call.method) {
                "enableSecureScreen" -> {
                    window.setFlags(
                        WindowManager.LayoutParams.FLAG_SECURE,
                        WindowManager.LayoutParams.FLAG_SECURE
                    )
                    result.success(true)
                }
                "disableSecureScreen" -> {
                    window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
                    result.success(true)
                }
                else -> result.notImplemented()
            }
        }
    }
}

3. iOS 侧实现

打开iOS项目ios/Runner.xcworkspace,找到AppDelegate.swift添加如下代码:

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
    // 通道名需和Flutter侧完全一致
    let channel = FlutterMethodChannel(name: "com.example.screen_secure/channel", binaryMessenger: controller.binaryMessenger)
    channel.setMethodCallHandler({
      [weak self] (call: FlutterMethodCall, result: FlutterResult) -> Void in
      guard let self = self else { return }
      switch call.method {
      case "enableSecureScreen":
        self.window.isSecure = true
        result(true)
      case "disableSecureScreen":
        self.window.isSecure = false
        result(true)
      default:
        result(FlutterMethodNotImplemented)
      }
    })

    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

4. Flutter 侧调用逻辑

在需要禁止录屏的页面中,绑定生命周期触发开关即可:

import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';

class SecurePage extends StatefulWidget {
  const SecurePage({super.key});

  @override
  State<SecurePage> createState() => _SecurePageState();
}

class _SecurePageState extends State<SecurePage> with WidgetsBindingObserver {
  static const platform = MethodChannel('com.example.screen_secure/channel');

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    // 进入页面开启防录屏
    platform.invokeMethod('enableSecureScreen');
  }

  // 处理后台切回场景,避免限制失效
  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    if (state == AppLifecycleState.resumed) {
      platform.invokeMethod('enableSecureScreen');
    }
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    // 离开页面关闭防录屏
    platform.invokeMethod('disableSecureScreen');
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("安全页面")),
      body: const Center(child: Text("该页面禁止截屏录屏")),
    );
  }
}

注意:Android的FLAG_SECURE同时会禁止最近任务页面的截图显示,iOS的isSecure属性在低于iOS 13的系统版本存在少量兼容性问题,建议针对性做适配测试。

内容的提问来源于stack exchange,提问作者Aditya Patil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 07:27:03