如何防止在iOS和Android上基于Flutter的应用程序中进行屏幕记录?

时间:2019-08-09 14:32:04

标签: android ios flutter

我们的应用需要出于某些重要原因阻止用户记录我们的屏幕。如何防止在iOS和Android上进行屏幕记录?

如果用户在iOS 11之后录制屏幕,似乎可以得到回叫。是否有任何方法可以使用该回叫实现防止屏幕录制?

3 个答案:

答案 0 :(得分:1)

您可以使用flutter_windowmanager插件。添加到pubspec.yaml文件后,将其导入要禁用屏幕快照的位置。使用

import 'package:flutter_windowmanager/flutter_windowmanager.dart';

现在将这一行添加到您的有状态小部件中。

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

现在普通用户无法拍摄屏幕截图。

答案 1 :(得分:0)

那是不完全可能的。 Android操作系统有两种方案

1-当Android设备未植根时-您可以使用标志 FLAG_SECURE ,该标志将阻止屏幕截图和视频记录。您可以在这里https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_SECURE

进一步阅读

2-当Android设备植根时-您可以通过编程方式检查设备是否植根。如果它是根目录,则可以停止应用程序进一步运行。这是检查根设备的链接-Determining if an Android device is rooted programmatically?

答案 2 :(得分:0)

将此代码放入您的MainActivity.kt中,您就可以完成:) (代码不是我的,我是在Github上找到的)

    import io.flutter.embedding.android.FlutterActivity
    import android.os.Build
    import android.view.ViewTreeObserver
    import android.app.ActivityManager
    import android.content.Context
    import android.content.pm.ApplicationInfo
    import android.content.pm.PackageManager
    import android.os.Bundle
    import android.util.Log
    import android.view.SurfaceView
    import android.view.View
    import android.view.ViewGroup
    import android.view.WindowManager
    import android.view.WindowManager.LayoutParams
    import io.flutter.embedding.engine.FlutterEngine
    import io.flutter.plugin.common.MethodChannel
    
    class MainActivity: FlutterActivity() {
            override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
        val flutter_native_splash = true
        var originalStatusBarColor = 0
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            originalStatusBarColor = window.statusBarColor
            window.statusBarColor = 0xffeaeaea.toInt()
        }
        val originalStatusBarColorFinal = originalStatusBarColor
    
    
            if (!setSecureSurfaceView()) {
                Log.e("MainActivity", "Could not secure the MainActivity!")
                // React as appropriate.
            }
            getWindow().addFlags(LayoutParams.FLAG_SECURE)
            getWindow().setFlags(LayoutParams.FLAG_SECURE,
                    LayoutParams.FLAG_SECURE)
            SurfaceView(applicationContext).setSecure(true)
        }
        private fun setSecureSurfaceView(): Boolean {
            val content = findViewById<ViewGroup>(android.R.id.content)
            if (!isNonEmptyContainer(content)) {
                return false
            }
            val splashView = content.getChildAt(0)
            if (!isNonEmptyContainer(splashView)) {
                return false
            }
            val flutterView = (splashView as ViewGroup).getChildAt(0)
            if (!isNonEmptyContainer(flutterView)) {
                return false
            }
            val surfaceView = (flutterView as ViewGroup).getChildAt(0)
            if (surfaceView !is SurfaceView) {
                return false
            }
            surfaceView.setSecure(true)
            this.window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)
            return true
        }
    
        private fun isNonEmptyContainer(view: View): Boolean {
            if (view !is ViewGroup) {
                return false
            }
            if (view.childCount < 1) {
                return false
            }
            return true
        }
    }