Остановить предустановленные приложения для записи экрана с экрана записи в Android

Я использую флаттер и отключил обычные приложения от записи экрана. Вот код

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

Проблема в том, что на некоторых телефонах предустановлены приложения для записи экрана, и указанный выше код не может помешать им записывать экран. Так есть ли другой способ запретить этим приложениям записывать экран? В других ответах я видел, что это невозможно, но в магазине игр есть несколько приложений, которые успешно достигают этого. Значит, должен быть способ. Я подумал, что по мере того, как приложения для записи экрана перерисовываются, они могут быть обнаружены с помощью фрагмента кода, поэтому мы можем показывать всплывающее окно, когда приложение для записи экрана перерисовывается. Является ли это возможным ? Если да, то как мы можем определить, нарисовано ли приложение поверх нашего приложения. Спасибо.


person Prashant Pandey    schedule 29.07.2020    source источник


Ответы (2)


Насколько мне известно, не существует официального способа универсального предотвращения захвата экрана/записи.

Это связано с тем, что FLAG_SECURE просто предотвращает захват на незащищенных дисплеях:

Флаг окна: обрабатывать содержимое окна как защищенное, предотвращая его появление на снимках экрана или просмотр на незащищенных дисплеях.

Но приложения с повышенными разрешениями могут создавать защищенные виртуальные дисплеи и использовать зеркальное отображение экрана для записи вашего экрана, что не соответствует флагу secure.

Прочтите эту статью, чтобы больше информации:

Это означало бы, что устройство Android, транслируемое на дисплей с защитой DRM, такой как телевизор, всегда будет отображать чувствительные экраны, поскольку понятие безопасности на самом деле означает «защищено авторским правом». Для приложений Google предотвратил эту проблему, запретив приложениям, не подписанным системным ключом, создавать виртуальные «защищенные» дисплеи.

Что касается того, как некоторым приложениям все еще удается это делать, вы можете попробовать следующее:

  • Проверьте, подключены ли какие-либо внешние/виртуальные дисплеи, и скройте/покажите свой контент на основе этого. см. это
  • Не показывать свой контент на корневых устройствах
person ShahiM    schedule 29.07.2020
comment
привет, я попытался проверить виртуальные дисплеи во флаттере (android) через MethodChannel, но не смог найти правильный способ. Не могли бы вы указать мне правильный код? Спасибо - person Prashant Pandey; 29.07.2020
comment
Мне жаль. Я не знаком с флаттером. На SO могут быть другие сообщения, которые могут вам помочь. - person ShahiM; 30.07.2020

Добавление этого кода в мой MainActivity.java решило проблему:

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

Импортируйте необходимые вещи.

person Prashant Pandey    schedule 30.07.2020
comment
@Parashant Pandey, не могли бы вы помочь мне сделать тот же код в родном приложении для Android? - person Muhammad Adeel Shoukat; 26.09.2020