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
相关产品推荐
相关产品推荐

