首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >停止预装屏幕录制应用程序在android中录制屏幕

停止预装屏幕录制应用程序在android中录制屏幕
EN

Stack Overflow用户
提问于 2020-07-29 15:20:31
回答 2查看 982关注 0票数 1

我正在使用颤振,并已禁用正常的应用程序,从录制屏幕。这是代码

代码语言:javascript
复制
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE);

问题是,有些手机的屏幕录音应用程序是预先安装的,上面的代码无法阻止他们录制屏幕。那么,还有其他方法阻止这些应用程序录制屏幕吗?在其他答案中,我发现这是不可能的,但在playstore上有一些应用程序成功地实现了这一点。所以一定有办法。我在想,当屏幕记录应用程序被绘制出来时,它们可能会通过一段代码被检测到,因此我们可以在绘制屏幕记录应用程序时显示弹出。有可能吗?如果是,我们如何检测应用程序是否绘制在我们的应用程序之上。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-30 11:58:39

将此代码添加到我的MainActivity.java中解决了这个问题:

代码语言:javascript
复制
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (!this.setSecureSurfaceView()) {
        Log.e("MainActivity", "Could not secure the MainActivity!");
    }

}



private final boolean setSecureSurfaceView() {
    ViewGroup content = (ViewGroup) this.findViewById(android.R.id.content);
    //Intrinsics.checkExpressionValueIsNotNull(content, "content");
    if (!this.isNonEmptyContainer((View) content)) {
        return false;
    } else {
        View splashView = content.getChildAt(0);
        //Intrinsics.checkExpressionValueIsNotNull(splashView, "splashView");
        if (!this.isNonEmptyContainer(splashView)) {
            return false;
        } else {
            View flutterView = ((ViewGroup) splashView).getChildAt(0);
            //Intrinsics.checkExpressionValueIsNotNull(flutterView,          "flutterView");
            if (!this.isNonEmptyContainer(flutterView)) {
                return false;
            } else {
                View surfaceView = ((ViewGroup) flutterView).getChildAt(0);
                if (!(surfaceView instanceof SurfaceView)) {
                    return false;
                } else {
                    ((SurfaceView) surfaceView).setSecure(true);
                    this.getWindow().setFlags(8192, 8192);
                    return true;
                }
            }
        }
    }

}

    private final boolean isNonEmptyContainer(View view) {
        if (!(view instanceof ViewGroup)) {
            return false;
        } else {
            return ((ViewGroup) view).getChildCount() >= 1;
        }
}

导入所需的东西。

票数 0
EN

Stack Overflow用户

发布于 2020-07-29 15:50:58

据我所知,没有官方的方法来普遍防止屏幕抓取/录音。

这是因为FLAG_SECURE只会阻止在非安全显示器上捕获

窗口标志:将窗口的内容视为安全,防止其出现在屏幕截图中或在非安全显示中被查看。

但是,具有较高权限的应用程序可以创建安全虚拟显示,并使用屏幕镜像记录屏幕,这不尊重安全标志。

欲了解更多信息,请阅读这篇文章

这意味着安卓设备像电视一样向DRM保护的显示器转换,总是显示敏感的屏幕,因为安全的概念实际上意味着“版权”。对于应用程序,Google阻止未由系统密钥签名的应用程序创建虚拟“安全”显示,从而阻止了这一问题。

关于一些应用程序如何仍然能够做到这一点,您可以尝试以下几种:

  • 检查是否有连接的外部/虚拟显示,并根据此隐藏/显示内容。请参阅
  • 不要在有根的设备上显示内容
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63156931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档