我们的应用需要出于某些重要原因阻止用户记录我们的屏幕。如何防止在iOS和Android上进行屏幕记录?
如果用户在iOS 11之后录制屏幕,似乎可以得到回叫。是否有任何方法可以使用该回叫实现防止屏幕录制?
答案 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
}
}