Как затемнить или заблокировать экран, как в телефонном разговоре?

Затемнение или блокировка экрана во время телефонного разговора в приложении Android может быть достигнуто с использованием различных методов и функций. В следующем ответе я рассмотрю несколько способов реализации этого функционала.

1. Использование PowerManager API:
PowerManager API позволяет управлять питанием и отображением экрана устройства. Метод goToSleep(time) может быть использован для перевода устройства в спящий режим. Здесь time - время в миллисекундах до блокировки экрана. Например, чтобы заблокировать экран немедленно, можно использовать goToSleep(0).

   PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
   powerManager.goToSleep(0);

2. Использование WindowManager API:
WindowManager API позволяет управлять окнами и отображением на экране устройства. Метод addView(view, params) позволяет добавить View поверх всех остальных окон и тем самым "затемнить" экран. Вы можете создать прозрачное View и добавить его поверх текущего окна.

   WindowManager.LayoutParams params = new WindowManager.LayoutParams(
           WindowManager.LayoutParams.FLAG_FULLSCREEN,
           WindowManager.LayoutParams.FLAG_FULLSCREEN,
           WindowManager.LayoutParams.TYPE_APPLICATION,
           WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
           PixelFormat.TRANSLUCENT);
   params.gravity = Gravity.TOP | Gravity.LEFT;
   params.x = 0;
   params.y = 0;
   params.width = WindowManager.LayoutParams.MATCH_PARENT;
   params.height = WindowManager.LayoutParams.MATCH_PARENT;
   
   View overlayView = new View(this);
   overlayView.setBackgroundColor(Color.BLACK);
   
   WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
   windowManager.addView(overlayView, params);

3. Использование флага FLAG_KEEP_SCREEN_ON:
Флаг FLAG_KEEP_SCREEN_ON позволяет сохранять экран включенным, не допуская срабатывания автоматической блокировки. Вы можете установить этот флаг для активити или конкретного View.

   getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

4. Использование KeyguardManager API:
KeyguardManager API позволяет управлять блокировкой экрана устройства. Метод requestDismissKeyguard(activity, callback) позволяет снять блокировку экрана программно.

   KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
   if (keyguardManager.isKeyguardLocked()) {
       keyguardManager.requestDismissKeyguard(activity, new KeyguardManager.KeyguardDismissCallback() {
           @Override
           public void onDismissError() {
               super.onDismissError();
               // Обработка ошибки
           }
   
           @Override
           public void onDismissSucceeded() {
               super.onDismissSucceeded();
               // Экран разблокирован
           }
   
           @Override
           public void onDismissCancelled() {
               super.onDismissCancelled();
               // Отменено пользователем
           }
       });
   }

Уточню, что использование некоторых из этих методов может потребовать разрешений или специальных прав доступа в манифесте вашего приложения. Кроме того, не все эти методы поддерживаются на всех устройствах и версиях Android. Поэтому важно тестировать функционал на разных устройствах, чтобы убедиться в его работоспособности.