MediaController всегда показывают на Android - PullRequest
22 голосов
/ 16 декабря 2010

Я использую в своем приложении mediacontroller, но он отображается только в течение 3 секунд. Я много искал, но в каждом документе я вижу только функцию показа, тайм-аут, но это никак не влияет. Как мне всегда показывать медиаконтроллер?

Я тестировал show(0), но это не имело никакого эффекта.

Ответы [ 10 ]

25 голосов
/ 07 декабря 2011

Вы можете расширить класс MediaController и программно установить его экземпляр для класса VideoView:

import android.content.Context;
import android.util.AttributeSet;
import android.widget.MediaController;

public class MyMediaController extends MediaController {
    public MyMediaController(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyMediaController(Context context, boolean useFastForward) {
        super(context, useFastForward);
    }

    public MyMediaController(Context context) {
        super(context);
    }

    @Override
    public void show(int timeout) {
        super.show(0);
    }

}

Вот пример использования:

VideoView myVideoView = (VideoView) findViewById(R.id.my_video_view);
MediaController mc = new MyMediaController(myVideoView.getContext());
mc.setMediaPlayer(myVideoView);
myVideoView.setMediaController(mc);
13 голосов
/ 19 января 2014

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

 mediaController = new MediaController(this){
        @Override
        public void hide() {
            // TODO Auto-generated method stub
            //do nothing
        }

        @Override
        public boolean dispatchKeyEvent(KeyEvent event) {

            if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) {

                if (mediaPlayer != null) {
                    mediaPlayer.reset();
                    mediaPlayer.release();
                    mediaPlayer = null;
                }
                super.hide();
                Activity a = (Activity)getContext();
                a.finish();

            }
        return true;
        }
    };
11 голосов
/ 16 декабря 2010

Попробуйте метод show следующим образом:

new media controller().show(50000);

А также отметьте http://developer.android.com/reference/android/widget/MediaController.html#show().

SudeepSR: Запишите это, если вы вызвали show (0), он будет отображать Media Controller, пока не будет вызвана функция hide ().

9 голосов
/ 24 октября 2013

Вы также можете создать встроенный анонимный класс и переопределить там метод hide вместо того, чтобы создавать для него совершенно новый класс:

mediaController = new MediaController(this) {
    @Override
    public void hide() {
    //Do not hide.
    }
};
6 голосов
/ 30 июля 2012

Вам нужно переопределить метод hide в пользовательском контроллере и ничего не делать.

public class MyMediaController extends MediaController {
..
@Override
    public void hide() {
        // Do nothing here in order to always show

    }
...
}

PS: Вам все равно нужно нажать на видео, чтобы отобразить медиа-контроллер.

5 голосов
/ 21 августа 2014

Попробовав все, что мог, у меня сработал следующий код!

    mVideoView = (VideoView) findViewById(R.id.video);

    mMediaController = new MediaController(this) {
        //for not hiding
        @Override
        public void hide() {}

        //for 'back' key action
        @Override
        public boolean dispatchKeyEvent(KeyEvent event) {
            if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
                Activity a = (Activity)getContext();
                a.finish();
            }
            return true;
        }
    };

    mMediaController.setAnchorView(mVideoView);
    mMediaController.setMediaPlayer(mVideoView);
    mVideoView.setMediaController(mMediaController);
    mMediaController.requestFocus();

    //only this showed the controller for me!!
    mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mVideoView.start();
            mMediaController.show(900000000);
        }
    });

    //finish after playing
    mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mediaPlayer) {
            finish();
        }
    });
2 голосов
/ 20 августа 2015

Попробуйте это:

videoView.setOnCompletionListener(onVideoCompleted);
videoView.setOnPreparedListener(onVideoPrepared);

mc.setAnchorView(videoView);
mc.setMediaPlayer(videoView);

MediaController mc = new MediaController(this);
videoView.setMediaController(mc);

MediaPlayer.OnPreparedListener onVideoPrepared = new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mc.show(0);
    }
};

MediaPlayer.OnCompletionListener onVideoCompleted = new MediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) {
        mc.hide();
    }
};
1 голос
/ 24 февраля 2015

Это может быть старая тема, но без ответа, попробуйте это:

final MediaController mediaController = new MediaController(this);
mediaController.setAlwaysDrawnWithCacheEnabled(true);
mediaController.setAnchorView(vView);
mediaController.requestFocus(); 
    vView.setOnPreparedListener( new OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mediaController.show( 0 );
        }
    });

vView.setVideoPath(Preview_Path);
vView.setMediaController(mediaController);
vView.start(); 

есть комментарий внутри метода "show" класса MediaController

**Use 0 to show
* the controller until hide() is called**

, поэтому использование 900000 или больше не поможет. надеюсь, это поможет вам.

веселит.

0 голосов
/ 15 июля 2017

Легко! Установите видимость "GONE" в событии скрытия и установите видимость "VISIBLE" в шоу!

        MediaController mc= new MediaController(zoom.this){

            @Override
            public void setMediaPlayer(MediaPlayerControl player) {
                super.setMediaPlayer(player);
                this.show(4000);
            }
            @Override
            public void show(int timeout) {
                super.show(timeout);
                this.setVisibility(View.VISIBLE);
            }
            //instead of press twice with press once "back" button to back
            @Override
            public boolean dispatchKeyEvent(KeyEvent event) {
                if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
                    Activity a = (Activity)getContext();
                    a.finish();
                }
                return true;
            }
            @Override
            public void hide() {
                // TODO Auto-generated method stub
                super.hide();
                this.setVisibility(View.GONE);
                //super.show(3000);
            }

        };
0 голосов
/ 07 марта 2017

Я хотел скрыть контроллер для видео и всегда показывать его для аудио.Это работало

    mController = new MediaController(this) {
        @Override
        public void hide() {

            if (mType != TYPE_AUDIO) super.hide();
        }

        @Override
        public boolean dispatchKeyEvent(KeyEvent event) {
            if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
                mController.hide();
                Activity a = (Activity)getContext();
                a.finish();
                return true;
            }
            return false;
        }
    };

В MediaPlayer.onPrepared я добавил:

if (mType == TYPE_AUDIO) mController.show(0);

Это заставляет контроллер показывать в начале воспроизведения аудио, но не воспроизведения видео.* Другие кнопки управления телефоном продолжают работать в обычном режиме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...