单凭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效果良好

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐