Android - Медиа контроллер не отображается - PullRequest
3 голосов
/ 01 февраля 2012

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

Я попытался создать MediaController с xml, сделать его всегда видимым, подключить его к медиаплееру с помощью mMediaController.setMediaPlayer(mVideoView), но ничего не виднона работу.

Я использую код классического видеоплеера от Google, который можно найти здесь: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Video.html

Что может происходить?Слушатель теряет событие?Разве он не привязан к реальному воспроизведению видео?Должен ли я добавить что-то еще к коду, который я использую (см. Ниже)?

public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.activity_content_video);

    [...]

    mVideoView = (VideoView) findViewById(R.id.surface);
    mainVideoHolder = (LinearLayout) findViewById(R.id.main_video_holder);


    holder = mVideoView.getHolder();
    holder.addCallback(this);

    mMediaController = new MediaController(this);

    mMediaController.show();
}



private void playVideo() {
    doCleanUp();
    try {
        mMediaPlayer = new MediaPlayer();
        Log.d(tag, "surfaceCreated");
        File f = new File(mAssetsPath);
        File[] files = f.listFiles();
        Log.d(tag, "File: " + files[0].toString());

        URI uri = URI.create("file://" + (files[0].toString()));
        File file = new File(uri);
        ParcelFileDescriptor parcel = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_WRITE);
        mMediaPlayer.setDataSource(parcel.getFileDescriptor());

        mMediaPlayer.setDisplay(holder);

        mMediaPlayer.prepare();

        mMediaPlayer.setOnBufferingUpdateListener(this);
        mMediaPlayer.setOnCompletionListener(this);
        mMediaPlayer.setOnPreparedListener(this);
        mMediaPlayer.setOnVideoSizeChangedListener(this);

        mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

        mMediaController.setMediaPlayer(mVideoView);

        mVideoView.setMediaController(mMediaController);
    } catch (Exception e) {
        Log.e(tag, "error: " + e.getMessage(), e);
    }
}


public void surfaceCreated(SurfaceHolder holder) {
    Log.d(tag, "surfaceCreated called");
    playVideo();
}

Любые идеи будут высоко оценены?

Нет темы, применяемой к действию и видеоиграет нормально, без каких-либо ошибок.Просто элементы управления мультимедиа не отображаются!

Спасибо.

Ответы [ 4 ]

1 голос
/ 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();
            }
        });
0 голосов
/ 11 декабря 2012

Я не уверен, что этот ответ немного запоздал, но, возможно, у кого-то еще есть такая проблема.Доку говорит стипендию:

Способ использовать этот класс - создать его программно.MediaController создаст набор элементов управления по умолчанию и поместит их в окно над вашим приложением.В частности, элементы управления будут плавать над представлением, заданным с помощью setAnchorView ().Окно исчезнет, ​​если оставить его бездействующим на три секунды, и снова появится, когда пользователь коснется вида привязки.

Таким образом, вы можете сделать это так (MediaPlayer в данном случае является VideoView:

VideoView videoView = (VideoView) findViewById(R.id.videoView);
videoView.setVideoPath(uri);
MediaController controller = new MediaController(this);
controller.setAnchorView(videoView);
controller.setMediaPlayer(videoView);
videoView.setMediaController(controller);
videoView.start();

Это сработало для меня.

0 голосов
/ 18 июля 2014
this work for me:

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);

        getWindow().setFormat(PixelFormat.UNKNOWN);

        mVideoView = (VideoView)findViewById(R.id.videoview);   
        mc = new MediaController(this){
            @Override
            public void hide() {} //dont hide control
        };

        new MyDelay2().execute("");
    }

    private class MyDelay2 extends AsyncTask<String,Void,String>{

        @Override
        protected String doInBackground(String... params) {                 
            Uri uri2 = Uri.parse("android.resource://com.blah/"+R.raw.cool);
            mVideoView.setVideoURI(uri2);
            return null;
        }


        @Override
        protected void onPostExecute(String result) {   
            dialog.dismiss();
            mc.setAnchorView(mVideoView);
            mc.setMediaPlayer(mVideoView);
            mc.setEnabled(true);
            mVideoView.setMediaController(mc);      

            mc.show();
        }       
    }
0 голосов
/ 01 февраля 2012

Где вы добавляете свой контроллер в макет? Также убедитесь, что контейнер достаточно большой. Дайте ему фон и посмотрите, хорошо ли он отображается на экране, прежде чем добавлять видеоконтроллер.

...