Панель поиска Android MediaController не обновляется

Я использую MediaController и MediaPlayer вместе, чтобы создать простой аудиоплеер в Android, взятый из примера, который я нашел здесь, на этом сайте.

Однако после долгих поисков я не смог найти решение своей проблемы: полоса прогресса/поиска не обновляется во время воспроизведения музыки. Он просто обновляется, когда что-то нажимается на MediaController (воспроизведение/пауза, вперед и т. д.).

Любое простое решение для этого, которое я не получаю?

ПРИМЕЧАНИЕ. Мой MediaController объявлен в XML, а мои методы MediaController.MediaPlayerControl просто используют класс MediaPlayer.


person PedroN    schedule 17.08.2012    source источник
comment
Предполагается ли, что панель поиска обновляется автоматически (через API MediaController/MediaPlayer) или вы должны обновлять ее с помощью кода?   -  person Vishwa Patel    schedule 17.08.2012
comment
Ну, я хотел, чтобы он обновлялся автоматически, так как: mediaController.setMediaPlayer(mediaPlayer) выполнено. К сожалению, он обновляется (без моего кода) только при нажатии любой из кнопок MediaController.   -  person PedroN    schedule 18.08.2012


Ответы (2)


Mediaplayer предоставляет метод getCurrentPosition(), который вы можете поместить в поток, чтобы постоянно обновлять индикатор выполнения.

    public int getCurrentPositionInt(){
        if (player != null)
            return player.getCurrentPosition();
        else
            return 0;
    }

Создайте тред или CountDownTimer для постоянного обновления панели поиска:

seekBar.setMax((getCurrentPositionInt() / 1000));

OR

MediaController.MediaPlayerControl mp;
mp.seekTo((getCurrentPositionInt() / 1000)) 
person Sayyam    schedule 17.08.2012
comment
Спасибо. Грустно осознавать, что он не будет обновляться из прикрепленного MediaPlayer. Еще одна вещь: как мне получить SeekBar из моего MediaController? - person PedroN; 18.08.2012
comment
Я не работал над MediaController, но в документации сказано, что он заботится о синхронизации элементов управления с состоянием MediaPlayer. Я думаю, вы можете использовать метод MediaController.MediaPlayerControl.seekTo((getCurrentPositionInt()/1000)) для этого. скорее получить seekBar. - person Sayyam; 18.08.2012
comment
Да, он прекрасно синхронизируется, но странно то, что он обновляется только при нажатии чего-либо. И seekTo не сработает, уже пробовал :( - person PedroN; 18.08.2012
comment
@Sayyam, к сожалению, метод seekTo не работает - видео просто зависает. Как мне получить seekBar, чтобы попробовать другой ваш метод? - person Ben Clayton; 10.10.2012

Я извиняюсь за мой английский!

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

public void onPrepared(MediaPlayer mp) {
                    mp.start();
                    Intent onPreparedIntent = new Intent("MP_READY");
                    LocalBroadcastManager.getInstance(activity).sendBroadcast(onPreparedIntent);
                }

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

private BroadcastReceiver mpReadyReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context c, Intent i) {            
        controller.show(0);
    }
};

Вам также необходимо зарегистрировать получателя в onResume() вашей активности.

protected void onResume() {
    super.onResume();
    LocalBroadcastManager.getInstance(this).registerReceiver(mpReadyReceiver,
            new IntentFilter("MP_READY"));
}

Теперь попробуйте вызывать controller.show только тогда, когда это необходимо.

Будьте осторожны, не создавая более одного экземпляра контроллера

person Diego Lomo Chon    schedule 01.10.2019