Подтвердить что ты не робот

Как выйти из режима Picture-in-Picture?

У нас есть enterPictureInPictureMode() для перемещения активности из ее текущей формы в представление "картинка в картинке" .

Каковы средства, с помощью которых мы возвращаем это, возвращая активность в нормальное состояние, помимо уничтожения активности? В Activity нет метода exitPictureInPictureMode(), leavePictureInPictureMode() или janeGetMeOffThisCrazyPictureInPictureModeThing(), и в документации, похоже, не рассматривается альтернатива.

Меня интересует решение для Android O, для режима "картинка в картинке" на мобильных устройствах, хотя, если это работает и для Android TV, замечательно!

UPDATE 2017-04-08. Если вы хотите вернуться в обычный режим, когда пользователь нажимает кнопку X для выхода из режима "картинка в картинке" , вы можете сделать что-то вроде этого:

  @Override
  public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
    super.onPictureInPictureModeChanged(isInPictureInPictureMode);

    if (!isInPictureInPictureMode) {
      getApplication().startActivity(new Intent(this, getClass())
        .addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
    }
  }

Ключевыми битами являются вызов startActivity(), чтобы снова запустить текущую активность с помощью FLAG_ACTIVITY_REORDER_TO_FRONT. При активности singleTask вам нужно вызвать это в некотором контексте не Activity, например, Application singleton. Кажется, это не вызывает onStop() или onStart(), но вызывает триггер onNewIntent() (с любым Intent вы переходите к startActivity()).

4b9b3361

Ответ 1

  • Переместите операцию на спину

    activity.moveTaskToBack(false /* nonRoot */);
    
  • восстановить активность на передней панели

    Intent startIntent = new Intent(PipActivity.this, PipActivity.class);
    startIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    activity.startActivity(startIntent);
    

Ответ 2

Я не думаю, что активность может решить оставить режим Picture-in-picture.

Из Предварительный просмотр Android O API:

Действие, входящее в режим PIP, переходит в состояние паузы, но остается включенным. Если пользователь отбирает активность PIP, система показывает меню для взаимодействия с пользователем; никакие события касания не достигают активности, пока она находится в состоянии PIP.

Активность будет уведомляться onPictureInPictureModeChanged().

Ответ 3

Официальная документация говорит, что в окне PIP появляется меню, которое позволяет переключаться на полный экран.

Окно PIP 240x135 dp и отображается на самом верхнем слое в одном из четырех углов экрана, выбранных системой. Пользователь может вывести меню PIP, которое позволяет им переключаться в окно PIP. в полноэкранном режиме или закрыть окно PIP, удерживая кнопку "Домой" на пульте дистанционного управления. Если на главном экране начинает воспроизводиться другое видео, Окно PIP автоматически закрывается.

И вы можете переопределить событие PIP, чтобы обрабатывать элементы пользовательского интерфейса, когда пользователь переключает режим PIP.

ссылка на onPictureInPictureModeChanged

@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
    if (isInPictureInPictureMode) {
        // Hide the controls in picture-in-picture mode.
        ...
    } else {
        // Restore the playback UI based on the playback status.
        ...
    }
}

Ответ 4

Я нашел 100% надежный способ сделать это.

  1. Установите атрибут taskAffinity для вашей активности PIP в манифесте, например, "com.package.pip". Неважно, что, оно просто должно отличаться от имени вашего пакета, которое является заданием по умолчанию. Это заставит его запускаться в совершенно отдельном стеке, как если бы это было совсем другое приложение.
  2. Всякий раз, когда вы хотите выйти из PIP, запустите его с помощью startActivity(new Intent(this, PipActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)) из другого действия.

Я просто посмотрел на то, что происходит, когда основное действие приложения в данный момент находится в режиме PIP, и вы запускаете его из панели запуска, и думали, что я могу повторить это, и я действительно мог.

Ответ 5

У меня такая же проблема:

  • MainActivity открывает VideoPlayerActivity котором включен режим PIP.
  • Нажмите кнопку назад, чтобы перейти в режим PIP.
  • Нажмите кнопку "Назад" еще раз, пока я не MainActivity из MainActivity.
  • Нажмите кнопку закрытия (X) в окне PIP.
  • Откройте приложение, оно откроет VideoPlayerActivity.

Хотя ни одно из перечисленных выше решений не работает для меня, я обнаружил, что единственный способ прослушать кнопку X - это переопределить onStop.

Когда действие восстанавливается из PIP, onResume и onPictureInPictureModeChanged, при нажатии кнопки X onStop и onPictureInPictureModeChanged.

Поэтому я попытался вызвать onPictureInPictureModeChanged finish() внутри onPictureInPictureModeChanged когда onStop уже вызывается.

override fun onStop() {
    super.onStop()
    onStopCalled = true
}

override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean, newConfig: Configuration) {
        if (isInPictureInPictureMode) {
            // ...
        } else {
            if (onStopCalled) {
                finish()
            }
        }
    }