单凭flutter现有的内置方法是无法完美的实现禁止功能,只能在android和ios两端分别处理
android端,更改MainActivity.java:
import android.os.Bundle;
import android.view.WindowManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.android.FlutterFragmentActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugins.GeneratedPluginRegistrant;
public class MainActivity extends FlutterFragmentActivity {
@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
///禁止截屏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
///设置进入后台后,多任务列表为空白页
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,WindowManager.LayoutParams.FLAG_SECURE);
}
}
ios端,更改AppDelegate.swift,因ios无内置直接调用屏蔽的方法,只能监听窗口的状态,当改变是替换为白屏窗口
import UIKit
import Flutter
import flutter_downloader
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
window = UIWindow.init(frame: UIScreen.main.bounds)
window.backgroundColor = .white
let vc = FViewController()
window.rootViewController = vc
GeneratedPluginRegistrant.register(with: self)
FlutterDownloaderPlugin.setPluginRegistrantCallback(registerPlugins)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
private func registerPlugins(registry: FlutterPluginRegistry) {
if (!registry.hasPlugin("FlutterDownloaderPlugin")) {
FlutterDownloaderPlugin.register(with: registry.registrar(forPlugin: "FlutterDownloaderPlugin")!)
}
}
class FViewController: FlutterViewController{
override func viewDidLoad() {
super.viewDidLoad()
let v = view
v?.backgroundColor = .white
v?.frame = .zero
view = makeSecureView()
view.addSubview(v!)
}
///防截图view
private func makeSecureView() -> UIView?{
let tf = UITextField()
tf.isSecureTextEntry = true
let fv = tf.subviews.first
fv?.subviews.forEach{$0.removeFromSuperview()}
fv?.isUserInteractionEnabled = true
return fv
}
}
截屏效果还可以,满足当前需求,android禁止录屏效果不理想,部分机型不兼容,ios效果良好