Flutter如何阻止截屏不生效

我在Flutter应用中使用了prevent_screenshot插件来阻止截屏,但实际测试时发现仍然可以截屏。代码中已经调用了PreventScreenshot.preventScreenshot(true)方法,并确认了权限和依赖都已正确配置。请问这是什么原因导致的?有没有其他可靠的解决方案?

2 回复

Flutter无法完全阻止截屏,但可限制应用内截屏:

  1. 使用FlutterWindowManager.addFlags(WindowManager.LayoutParams.FLAG_SECURE)
  2. 仅适用于Android,iOS系统限制更多。
  3. 无法阻止物理设备截屏(如系统快捷键)。

更多关于Flutter如何阻止截屏不生效的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,可以通过以下方法阻止截屏,但需要注意平台限制:

Android 解决方案

1. 修改 MainActivity(推荐)

import android.os.Bundle
import android.view.WindowManager
import io.flutter.embedding.android.FlutterActivity

class MainActivity: FlutterActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        window.setFlags(
            WindowManager.LayoutParams.FLAG_SECURE,
            WindowManager.LayoutParams.FLAG_SECURE
        )
    }
}

2. 使用 Platform Channel 动态控制

import 'package:flutter/services.dart';

class ScreenSecurity {
  static const platform = MethodChannel('app.screen/security');

  static Future<void> enableScreenSecurity() async {
    try {
      await platform.invokeMethod('enableSecureScreen');
    } on PlatformException catch (e) {
      print("Failed to enable screen security: '${e.message}'");
    }
  }

  static Future<void> disableScreenSecurity() async {
    try {
      await platform.invokeMethod('disableSecureScreen');
    } on PlatformException catch (e) {
      print("Failed to disable screen security: '${e.message}'");
    }
  }
}

iOS 限制

iOS 系统限制较多,无法完全阻止截屏,但可以:

  • 监听截屏事件并做出响应
  • 显示警告信息
import 'package:flutter/services.dart';

class ScreenShotDetector {
  static void init() {
    SystemChannels.lifecycle.setMessageHandler((msg) {
      if (msg == AppLifecycleState.resumed.toString()) {
        // 应用回到前台时检查
        _showSecurityWarning();
      }
      return Future.value(msg);
    });
  }

  static void _showSecurityWarning() {
    // 显示安全警告
  }
}

注意事项

  1. Android 有效:FLAG_SECURE 在 Android 上能有效阻止截屏和录屏
  2. iOS 限制:iOS 无法完全阻止系统级截屏
  3. 权限问题:确保在 AndroidManifest.xml 中有相应权限
  4. 用户体验:考虑在敏感页面启用,其他页面禁用

建议在敏感信息展示页面启用此功能,普通页面保持正常体验。

回到顶部