【问题标题】:Flutter: disable screenshot capture for appFlutter:禁用应用程序的屏幕截图
【发布时间】:2019-02-18 09:30:15
【问题描述】:

我正在制作一个 Flutter 应用程序,我需要确保用户无法捕获应用程序的屏幕截图(任何屏幕)。有什么方法可以在 Flutter 中实现这一点,还是我需要为 Android 和 IOS 编写本机代码?

【问题讨论】:

  • 这有可能吗?
  • 我不知道,所以我在这里问。
  • 在flutter中它目前不可用,但是您可以按照您所说的为Android和iOS编写本机代码,也可以在flutter的GitHub上创建一个请求;)
  • 如果在 Android 和 iOS 原生是可行的,那么在 Flutter 中应该可以通过编写插件或使用通道来实现。但首先你必须确定它可以在本地完成。
  • 相关网址:FLAG_SECURE

标签: dart flutter


【解决方案1】:
  1. 在 Flutter 项目的嵌入式 android 项目目录中找到 MainActivity 类
  2. 将以下导入添加到您的主要活动类:import android.view.WindowManager.LayoutParams;
  3. 将以下行添加到 MainActivity 的 onCreate 方法中:getWindow().addFlags(LayoutParams.FLAG_SECURE);

【讨论】:

  • 那么 ios 呢?
  • 似乎还没有真正适用于 iOS 的解决方案。
  • flutter 中“MainActivity 类”文件的路径是什么?请提出建议。
  • 对于科特林? MainActivity.kt ?
  • @Rebar for iOS 可能是mrgulshanyadav.medium.com/…
【解决方案2】:

对于 Flutter2 项目

方法一:使用包flutter_windowmanager

方法二:

在 Android 中使用 kotlin

Step 1 使用路径打开文件“mainActivity.kt”

android\app\src\main\kotlin\com\example\auth_email\MainActivity.kt

第 2 步导入库

import android.view.WindowManager.LayoutParams

import io.flutter.embedding.android.FlutterActivity

import io.flutter.embedding.engine.FlutterEngine

第 3 步在主要活动类中

class MainActivity: FlutterActivity() {
  override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
    window.addFlags(LayoutParams.FLAG_SECURE)
    super.configureFlutterEngine(flutterEngine)
  }
}

在 iOS Swift 中:AppDelegate.swift 文件

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {

  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
  
  // <Add>
  override func applicationWillResignActive(
    _ application: UIApplication
  ) {
    self.window.isHidden = true;
  }
  override func applicationDidBecomeActive(
    _ application: UIApplication
  ) {
    self.window.isHidden = false;
  }
  

}

【讨论】:

  • 好消息是,现在它也支持 NULL SAFETY
  • 如果我想允许截图但想在最近的标签窗口中隐藏屏幕怎么办?适用于 IOS 和 Android
【解决方案3】:

对我有用的是在 MainActivity.java 文件中编写以下代码。

@Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
  }

并导入这些包!

import android.view.WindowManager; 
import android.view.WindowManager.LayoutParams;
import android.os.Bundle; // required for onCreate parameter

【讨论】:

  • 也使用截屏应用测试过!
  • 你为什么要重复同一个单位两次?
【解决方案4】:

最简单的方法是使用名为flutter_windowmanager的flutter包

首先在你的 Flutter 项目的 pubspec.yaml 文件中导入它的最新版本,然后运行 ​​pub get。然后在您要禁用屏幕截图和屏幕录制的小部件的 initState() 方法中添加以下代码。

    Future<void> secureScreen() async {
        await FlutterWindowManager.addFlags(FlutterWindowManager.FLAG_SECURE); 
     }
    
     @override
     void initState() {
        secureScreen();
        super.initState();
     }

     @override
     void dispose(){
        super.dispose();
        await FlutterWindowManager.clearFlags(FlutterWindowManager.FLAG_SECURE);
     }

如果您想禁用整个应用的屏幕截图,只需在 main.dart 文件的 main() 函数中调用 securescreen() 方法(如上定义)即可。

【讨论】:

  • 我不知道它是否适用于 IOS,但它适用于 android。
  • @Priyanshjain 亲爱的,您忘记在 dispose() 方法中调用 clearFlags - await FlutterWindowManager.clearFlags( FlutterWindowManager.FLAG_SECURE); 否则它将限制对所有其他屏幕/页面进行截图。请更新您的答案。非常感谢。
【解决方案5】:

通过以下两个步骤可以很容易地防止屏幕截图。

我正在使用 VS 代码。

第一步使用路径android\app\src\main\kotlin\com\example\auth_email\MainActivity.kt打开文件“mainActivity.kt”

第 2 步添加两行

(a) import android.view.WindowManager.LayoutParams; 

(b) getWindow().addFlags(LayoutParams.FLAG_SECURE); in MainActivity: FlutterActivity() section

重启应用

enter image description here

【讨论】:

    【解决方案6】:

    这适用于 iOS。在你的Runner &gt; AppDelegate.m:

    @implementation AppDelegate
    
    - (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
      [GeneratedPluginRegistrant registerWithRegistry:self];
      // Override point for customization after application launch.
      return [super application:application didFinishLaunchingWithOptions:launchOptions];
    }
    
    - (void)applicationWillResignActive:(UIApplication *)application{
        self.window.hidden = YES;
    }
    
    - (void)applicationDidBecomeActive:(UIApplication *)application{
        self.window.hidden = NO;
    }
    
    @end
    

    【讨论】:

    • 三思而后行 AppDelegate.swiftAppDelegate.m ?
    • AppDelegate.m 以防你的 iOS 项目在 ObjectiveC 中。如果您的 iOS 项目使用 Swift,则必须有 AppDelegate.swift 的等价物:)
    • 什么是 [GeneratedPluginRegistrant registerWithRegistry:self];我正在使用本机 ios 代码
    • 当应用在前台时这不起作用。
    • 能否也请您提供 swift 服务
    【解决方案7】:

    iOS 上,我已在扩展程序 https://stackoverflow.com/a/67054892/4899849 的帮助下禁用截屏。执行后续步骤:

    1. AppDelegate中添加属性:

      var field = UITextField()

    2. didFinishLaunchingWithOptions调用下一个方法:

       private func addSecuredView() {
         if (!window.subviews.contains(field)) {
           window.addSubview(field)
           field.centerYAnchor.constraint(equalTo: window.centerYAnchor).isActive = true
           field.centerXAnchor.constraint(equalTo: window.centerXAnchor).isActive = true
           window.layer.superlayer?.addSublayer(field.layer)
           field.layer.sublayers?.first?.addSublayer(window.layer)
       }
      

      }

    3. 覆盖委托方法:

       override func applicationWillResignActive(_ application: UIApplication) {
         field.isSecureTextEntry = false
       }
      
       override func applicationDidBecomeActive(_ application: UIApplication) {
         field.isSecureTextEntry = true
       }
      

    现在,当您在应用中截屏或录制屏幕视频时,您会看到黑色图像或视频。希望,这会有所帮助,因为我花了 2 天时间试图让它工作)

    【讨论】:

      【解决方案8】:

      如果你使用的是 kotlin

      打开 MainActivity.kt

      在导入结束时添加以下代码

      import android.view.WindowManager.LayoutParams
      

      在 super.onCreate(savedInstanceState) 末尾添加以下代码

      window.addFlags(LayoutParams.FLAG_SECURE)
      

      完成了。

      【讨论】:

        【解决方案9】:

        尝试使用

        对于 android 编辑 MainActivity.kt

        package com.package.app_name
        
        import android.view.WindowManager.LayoutParams
        import io.flutter.embedding.android.FlutterActivity
        import io.flutter.embedding.engine.FlutterEngine
        
        class MainActivity: FlutterActivity() {
        override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
            window.addFlags(LayoutParams.FLAG_SECURE)
            super.configureFlutterEngine(flutterEngine)
          }
        }
        

        【讨论】:

          【解决方案10】:
          1. pubspec.yaml文件中定义这个包

          flutter_windowmanager: ^0.0.1+1

          1. 获取依赖项

          flutter pub get

          1. 您需要使用awaitasync 调用FlutterWindowManager 的方法。
          2. 您必须在StatefulWidget 中添加几行代码。
          Future<void> secureScreen() async { 
            await FlutterWindowManager.addFlags(FlutterWindowManager.FLAG_SECURE);
          }
          
          @override 
          void initState() {
            secureScreen();
            super.initState(); 
          }
          

          【讨论】:

          • 这仅适用于 android 而不适用于 iOS。
          • @sagarsuri 你有 iOS 的解决方案吗?
          • @b.john 在花了一些时间后,我意识到 Apple 没有提供任何官方 API 来防止截屏或录制。所以我把它省略了,只为android实现。
          【解决方案11】:

          您可能会在 iOS 上聆听屏幕截图键,并在按下组合键时将屏幕变黑。

          【讨论】:

            猜你喜欢
            • 2022-10-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-09-10
            • 1970-01-01
            • 2023-03-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多