2010-12-16 17 views
17

Estoy utilizando el controlador de medios en mi aplicación, pero se muestra solo durante 3 segundos. He buscado mucho, pero en cada documento veo solo la función de mostrar, establecer el tiempo de espera, pero no tiene ningún efecto. ¿Cómo puedo mostrar siempre el controlador de medios?MediaController siempre se muestra en Android

He probado show(0), pero no tuvo ningún efecto.

Respuesta

23

Puede extender la clase MediaController y programáticamente establecer una instancia del mismo a una clase 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); 
    } 

} 

Aquí está el uso:

VideoView myVideoView = (VideoView) findViewById(R.id.my_video_view); 
MediaController mc = new MyMediaController(myVideoView.getContext()); 
mc.setMediaPlayer(myVideoView); 
myVideoView.setMediaController(mc); 
5

Lo que hay que hacer es, overrride la ocultar el método en el controlador personalizado y no hacer nada.

public class MyMediaController extends MediaController { 
.. 
@Override 
    public void hide() { 
     // Do Nothing to keep the show the controller all times 

    } 
... 
} 

PD: Aún necesita hacer clic en el video para mostrar el controlador de medios.

+0

Cómo mostrar el controlador de medios sin seleccionar ningún video, por supuesto, no será funcional hasta que se seleccione el video, sino para que ocupe ese espacio. – Jasper

7

También puede crear una clase anónima en línea y reemplazar el método ocultar allí en vez de tener que crear una clase completamente nueva para él:

mediaController = new MediaController(this) { 
    @Override 
    public void hide() { 
    //Do not hide. 
    } 
}; 
+4

¿Por qué el voto a favor? Es una cortesía común para explicar cuándo downvoting – Gerard

11

Se pueden crear en línea clase anónima y anular ciertos métodos. Debe anular el método ocultar y no hacer nada allí. También necesita anular el método dispatchKeyEvent para verificar si la tecla Atrás presiona y llama al super.hide(). De lo contrario, al presionar hacia atrás, el controlador no se ocultará y la actividad no se podrá cerrar.

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; 
     } 
    }; 
+1

Mis controles de volumen (en la pantalla y los botones del dispositivo) no funcionan en absoluto cuando anulo estas funciones. – blackcompe

+1

El código en la última publicación en (http://stackoverflow.com/questions/23338989/android-overriding-back-button-causes-volume-buttons-stop-working) funciona perfectamente. – blackcompe

+0

Solo 'return true' if' event.getKeyCode() == KeyEvent.KEYCODE_BACK'. De lo contrario 'return false' y luego los otros botones del dispositivo continuarán trabajando –

4

¡Después de intentar todo lo que pude, el siguiente código funcionó para mí!

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

use esto, esto funcionó para mí: mediaController.show (0); – ralphgabb

0

Esto puede ser un hilo viejo, pero todavía sin respuesta, intente esto:

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(); 

theres un comentario dentro de la Clase MediaController método de "espectáculo"

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

por lo que usar 900000 o un mayor valor no ayudará. Espero que te ayude.

aplausos.

0

Prueba esto:

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(); 
    } 
}; 
0

quería desaparecer el controlador videos y siempre muestran que para el audio. Esto funcionó

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; 
     } 
    }; 

En MediaPlayer.onPrepared añadí:

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

Esto hace que el controlador para mostrar en el inicio de la reproducción de audio, pero no la reproducción de vídeo.

Los demás botones de control del teléfono continúan funcionando normalmente.

0

¡Fácil! ¡Establezca la visibilidad "GONE" en el evento hide y configure la visibilidad "VISIBLE" en show!

 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); 
      } 

     }; 
Cuestiones relacionadas