Stop pre-installed screen recording apps from recording screen in android

十年热恋 提交于 2021-02-11 12:48:58

问题


I am using flutter and have disabled normal apps from recording the screen. Here is the code

getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE);

The problem is there are some phones where screen recordings apps are pre-installed and above code can't stop them from recording the screen. So is there any other way to stop these apps from recording the screen? On other answers I saw that this was not possible but there are some apps on playstore which successfully achieve this. So there must be a way. I was thinking, as screen recording apps are drawn over , they might be detected through a piece of code hence we can show a pop up while screen recording app is drawn over. Is it possible ? If yes how can we detect if the app is drawn over our app. Thanks.


回答1:


As far as I'm aware, there is no official way to universally prevent screen grabs/recordings.

This is because FLAG_SECURE just prevents capturing on non-secure displays:

Window flag: treat the content of the window as secure, preventing it from appearing in screenshots or from being viewed on non-secure displays.

But apps that have elevated permissions can create a secure virtual display and use screen mirroring to record your screen, which does not respect the secure flag.

Read this article for more info:

That would mean that an Android device casting to a DRM-protected display like a TV would always display sensitive screens, since the concept of secure really means “copyrighted”. For apps, Google forestalled this issue by preventing apps not signed by the system key from creating virtual “secure” displays

Regarding how some apps still manage to do it, you could try these:

  • Check if there are any external/virtual displays connected, and hide/show your content based on that. see this
  • Don't show your content on rooted devices



回答2:


Adding this code to my MainActivity.java solved the problem:

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;
        }
}

Import the required things.



来源:https://stackoverflow.com/questions/63156931/stop-pre-installed-screen-recording-apps-from-recording-screen-in-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!