Nano Hash - криптовалюты, майнинг, программирование

Android Media Controller скрывает, когда теряет фокус

Я использую медиаконтроллер, связанный с медиаплеером, для воспроизведения звука. Проблема в том, что медиа-контроллер скрывается, как только теряет фокус. У меня есть кнопка, при нажатии которой воспроизводится звук, а внизу экрана появляется медиа-контроллер.

Но при нажатии лайф пауза секунд через 5 медиаконтроллер сам прячется.

вот часть моих кодов. Я останавливаю медиаплеер, как только медиаконтроллер прячется, чтобы звук не воспроизводился постоянно

Все коды для медиа-контроллера:

     mediaPlayer = new MediaPlayer();
                            mediaPlayer.setOnPreparedListener(currentFragment);

                            mediaController = new MediaController(getActivity()){
                                @Override
                                public void hide()
                                {

                                    if(mediaPlayer.isPlaying()){
                                        mediaPlayer.stop(); 
                                    }
                                    super.hide();
                                }
                            };


                              try {
                                mediaPlayer.setDataSource(sound.getSound());
                                 mediaPlayer.prepareAsync();
                            } catch (IllegalArgumentException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            } catch (SecurityException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            } catch (IllegalStateException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }

                              mediaPlayer.start();


    @Override
            public void onPrepared(MediaPlayer mp) {
                Log.d("media status", "onPrepared");



                handler.post(new Runnable() {
                  public void run() {

                      launchMediaController();
                      progress.dismiss();
                  }
                });

            }



void launchMediaController(){
            mediaController.setEnabled(true);

            mediaPlayer.start();
            mediaController.setMediaPlayer(soundController);
            mediaController.setAnchorView(getView());
            mediaController.show(0);
        }

        private class SoundController implements MediaController.MediaPlayerControl{

            public void start() {
                mediaPlayer.start();
              }

              public void pause() {
                mediaPlayer.pause();
              }

              public int getDuration() {
                return mediaPlayer.getDuration();
              }

              public int getCurrentPosition() {
                return mediaPlayer.getCurrentPosition();
              }

              public void seekTo(int i) {
                mediaPlayer.seekTo(i);
              }

              public boolean isPlaying() {
                return mediaPlayer.isPlaying();
              }

              public int getBufferPercentage() {
                return 0;
              }

              public boolean canPause() {
                return true;
              }

              public boolean canSeekBackward() {
                return true;
              }

              public boolean canSeekForward() {
                return true;
              }

            @Override
            public int getAudioSessionId() {
                // TODO Auto-generated method stub
                return 0;
            }   
      }

Правки: Основываясь на ответе Либина, я безуспешно сделал следующее: Расширяет MediaController и переопределяет событие касания

private class MyMediaController extends MediaController{

            public MyMediaController(Context context) {
                super(context);
                // TODO Auto-generated constructor stub
            }
            @Override
            public boolean onTouchEvent(MotionEvent event) {
                return true;
            }
        }

Использовать расширенный класс

mediaController = new MyMediaController(getActivity()){
                            @Override
                            public void hide()
                            {

                                if(mediaPlayer.isPlaying()){
                                    mediaPlayer.stop(); 
                                }
                                super.hide();
                            }
                        };

launchMediaController() на самом деле запускает медиа-контроллер. Мой вопрос, почему медиа-контроллер скрывается сам по себе через несколько секунд после того, как пользователь прикоснется к нему? Есть ли какое-нибудь решение для этого?


Ответы:


1

когда вы вызываете show() , вы можете установить продолжительность отображения контроллера на экране. поэтому контроллер автоматически скроется после «тайм-аута» в миллисекундах бездействия.

Вы можете установить тайм-аут как 0, чтобы показать контроллер до явного вызова скрытия.

   controller.show(0); 

Используйте 0, чтобы показать контроллер, пока не будет вызван метод hide().

Если вы используете метод show() без аргумента, время ожидания по умолчанию составляет 3 секунды.

Вот фрагмент кода из вызова метода show(int timeOut)

 Message msg = mHandler.obtainMessage(FADE_OUT);
    if (timeout != 0) {
        mHandler.removeMessages(FADE_OUT);
        mHandler.sendMessageDelayed(msg, timeout);
    }

Обработчик отправляет сообщение с задержкой, если идентификатор тайм-аута не равен 0, а в обработчике, если сообщение FADE_OUT, вызывается метод скрытия

ИЗМЕНИТЬ

Ошибка в коде MediaController. В onTouchEvent устанавливается тайм-аут по умолчанию, который переопределяет тайм-аут 0.

  @Override
public boolean onTouchEvent(MotionEvent event) {
    show(sDefaultTimeout);
    return true;
}

Это можно исправить, создав собственный MediaController и переопределив onTouchEvent.

@Override
public boolean onTouchEvent(MotionEvent event) {
    return true;
}
09.04.2014
  • это то, что я делаю, но оно скрывается через несколько секунд после того, как пользователь прикоснется к нему 09.04.2014
  • Я добавил код, который использую для отображения медиаконтроллера. 09.04.2014
  • см. мой ответ. создайте собственный MediaContoller и переопределите onTouchEvent() 09.04.2014
  • То, что вы сделали, очень логично, но не работает, я обновил вопрос с предложением, которое вы сказали 10.04.2014
  • Хорошо, кажется, у Mediacontoller есть прослушиватель onTouch для просмотра декора окна, который вызывает скрытие. Нам нужно найти способ отключить это. дайте вам знать, если я могу создать образец на этом 10.04.2014
  • хорошо, я тоже постараюсь, и выложу какие-нибудь обновления по этому вопросу, спасибо !! 10.04.2014
  • Было ли найдено решение для этого? 25.06.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..