如何防止我的flutter应用程序中特定部分的屏幕截图?

时间:2020-05-12 08:56:18

标签: android flutter kotlin dart

借助此thread,我可以防止我的应用中的屏幕截图,但是如何才能仅在应用的特定部分使用它。这使我的整个应用程序无法共享。

我有一个部分,向我的高级会员显示注释。我不希望用户对此截图。

我的应用程序在kotlin中具有MainActivity,因此当我从提到的线程中复制Java代码时,我的IDE将其转换为Kotlin。

import android.os.Bundle
import android.view.WindowManager.LayoutParams
import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity: FlutterActivity() {
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        window.setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE)
    }
}

2 个答案:

答案 0 :(得分:1)

您必须使用MethodChannel来执行此操作,然后随意调用启用/禁用屏幕截图的方法。

您可以检查here的操作方法。这些示例调用了一种获取电池电量的方法,只需将其替换为您的Kotlin方法即可启用/禁用屏幕截图。

然后,您可以执行以下操作来传递参数,以决定该参数是启用还是禁用:

final platform = MethodChannel("your_channel_name");
platform.invokeMethod('setScreenshotEnableStatus',{'enabled': true})

,然后从MethodCall收到的MethodCallHandler对象中,您可以通过以下方式恢复该参数:

call.argument('enabled')

另一种实现方法是创建两个本机方法,一个用于启用,一个用于禁用,然后相应地调用它们。

另一个用于本机集成的资源可能是this,我已经快速浏览了这篇文章,看起来还可以。

答案 1 :(得分:0)

您可以使用为此目的制作的Flutter软件包flutter_windowmanager

虽然Android本机支持多种窗口模式,但没有很好的方法在正在运行的Flutter应用程序中动态设置它们-而是要求在Flutter应用程序本身的本机MainActivity中设置这些标志。

在我们的应用程序中,我们只希望禁用特定屏幕的屏幕截图,而不是在整个应用程序生命周期中禁用屏幕截图。现在,只需调用以下命令即可完成此操作:

await FlutterWindowManager.addFlags(FlutterWindowManager.FLAG_SECURE);

相关屏幕。

通过使用RouteAware混合,或在有状态小部件的情况下,通过直接切换initState()和dispose()方法,可以进一步将其切换到特定屏幕。