flutter如何实现screenshot_guard功能
在Flutter中如何实现类似screenshot_guard的功能来防止用户截屏或录屏?我看到有些应用可以检测到截屏操作并弹出警告,或者直接禁止截屏。请问Flutter有没有现成的插件或方法可以实现这个功能?需要兼容Android和iOS平台,最好能提供具体的代码示例。另外,这种功能在App Store和Google Play上架时会不会被拒绝?
2 回复
在Flutter中实现截图防护(screenshot_guard)功能,可以通过以下步骤实现:
1. 基本原理
- 在Android上使用
FLAG_SECURE标记防止截图和录屏。 - 在iOS上使用
preventCapture属性(iOS 13+)实现类似功能。
2. 实现方法
Android配置
在android/app/src/main/AndroidManifest.xml中为Activity添加属性:
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:windowSoftInputMode="adjustResize"
android:screenOrientation="portrait"
android:showWhenLocked="true"
android:turnScreenOn="true">
<!-- 添加以下代码防止截图 -->
<meta-data
android:name="android.app.flag_security"
android:value="true" />
</activity>
iOS配置
在ios/Runner/Info.plist中添加:
<key>NSSupportsCapture</key>
<false/>
3. Flutter代码实现
使用flutter_secure_screen插件(需自行添加依赖):
dependencies:
flutter_secure_screen: ^1.0.0
在Flutter中启用防护:
import 'package:flutter_secure_screen/flutter_secure_screen.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
// 启用安全屏幕
FlutterSecureScreen.singleton.setSecureScreen();
runApp(MyApp());
}
4. 自定义实现(平台通道)
如需更精细控制,可使用平台通道:
Flutter端:
import 'package:flutter/services.dart';
class SecureScreen {
static const platform = MethodChannel('secure_screen_channel');
static Future<void> enableSecureScreen() async {
try {
await platform.invokeMethod('enableSecureScreen');
} on PlatformException catch (e) {
print("Failed: '${e.message}'.");
}
}
static Future<void> disableSecureScreen() async {
try {
await platform.invokeMethod('disableSecureScreen');
} on PlatformException catch (e) {
print("Failed: '${e.message}'.");
}
}
}
Android端(Kotlin):
class MainActivity : FlutterActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "secure_screen_channel").setMethodCallHandler { call, result ->
when (call.method) {
"enableSecureScreen" -> {
window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)
result.success(null)
}
"disableSecureScreen" -> {
window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
result.success(null)
}
else -> result.notImplemented()
}
}
}
}
iOS端(Swift):
import UIKit
public class SecureScreenPlugin: NSObject, FlutterPlugin {
public static func register(with registrar: FlutterPluginRegistrar) {
let channel = FlutterMethodChannel(name: "secure_screen_channel", binaryMessenger: registrar.messenger())
let instance = SecureScreenPlugin()
registrar.addMethodCallDelegate(instance, channel: channel)
}
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
switch call.method {
case "enableSecureScreen":
if #available(iOS 13.0, *) {
UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.forEach { windowScene in
windowScene.windows.forEach { window in
window.isSecure = true
}
}
}
result(nil)
case "disableSecureScreen":
if #available(iOS 13.0, *) {
UIApplication.shared.connectedScenes.compactMap { $0 as? UIWindowScene }.forEach { windowScene in
windowScene.windows.forEach { window in
window.isSecure = false
}
}
}
result(nil)
default:
result(FlutterMethodNotImplemented)
}
}
}
5. 注意事项
- 测试时需在真机运行,模拟器可能无法验证效果。
- iOS 13以下版本不支持此功能。
- 某些系统功能(如辅助工具)可能仍能捕获屏幕内容。
通过以上方法,可以有效防止应用界面被截图或录屏,保护敏感信息。


