2011-06-30 12 views
6

Esta actividad a continuación funciona bien, pero el control de medios solo se muestra si hago clic en la pantalla. Y el segundo problema es la pantalla del controlador de medios solo durante 3 segundos. ¿Qué debo hacer para eliminar este problema?El controlador de medios Android muestra la pantalla durante un breve período de tiempo

public class PlayingActivity extends Activity 
{ 

    private VideoView mVideoView; 
    private EditText mPath; 
    MediaController mediaController; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.playingactivity); 
     mPath = (EditText) findViewById(R.id.path); 
     mPath.setText(GlobalVariable.getstrEmail()); 
     mVideoView = (VideoView) findViewById(R.id.surface_view); 
     Uri uri = Uri.parse("/sdcard/download/test.mp3"); 
     mediaController = new MediaController(this); 
     mediaController.findFocus(); 
     mediaController.setEnabled(true); 
     mediaController.show(0); 
     mediaController.setAnchorView(mVideoView); 
     mVideoView.setMediaController(mediaController); 
     mVideoView.setVideoURI(uri); 
     mVideoView.start(); 
    } 
} 
+0

¿Qué resultado quieres? ¿MediaController siempre se muestra en la pantalla? – Judy

+0

sí, lo quiero siempre hasta mp3 file finish – Android

+0

Hay una nota de Android Develop doc: public void show (int timeout) Recuerdo que puedo usar "show (0)" con éxito en Android 1.5. Solo lo intento en Android 2.3, el resultado es el mismo para ti. No entiendo este caso. Tal vez puede establecer la duración del mp3 en el tiempo de espera del MediaController. Mostrar el controlador en la pantalla. Desaparecerá automáticamente después de 'timeout' milisegundos de inactividad. Parámetros tiempo de espera \t Tiempo de espera en milisegundos. Use 0 para mostrar el controlador hasta que se invoque hide(). – Judy

Respuesta

18
mediaController.requestFocus(); 

hará que sea pantalla en cuanto empiece el vídeo (sin que sea necesario el clic)

y

mVideoView.setOnPreparedListener(new OnPreparedListener() { 

      @Override 
      public void onPrepared(MediaPlayer mp) { 
       mediaController.show(0); 
      } 
     }); 

lo mantendrá en la pantalla. Espero que ayude

1

Las sugerencias de Neo son perfectas. Pero me gustaría agregar "mp.start()" al método onPrepared (MediaPlayer mp), sin el cual el archivo multimedia no comenzará a reproducirse.

0

Solicitar el foco o especificar 0 en el método de show nunca funcionó para mí.

El problema es que la clase MediaController tiene un tiempo de espera predeterminado de 3000ms o 3seconds. Y su método show() reemplaza nuestro parámetro dado por su parámetro predeterminado. Es un error estúpido como resultado de un código no probado en Google.

Tenemos que implementar una pésima solución para reemplazar el valor predeterminado por el valor deseado.

Pruebe el siguiente código. Deberia de funcionar.

mediaControls = new MediaController(getActivity()){ 
     @Override 
     public void show (int timeout){ 
      if(timeout == 3000) timeout = 20000; //Set to desired number 
      super.show(timeout); 
     } 
    }; 
mVideoView.setMediaController(mediaControls); 
0

Hay dos problemas principales en MediaController:

  1. ocultar automáticamente es 3s por defecto
  2. Al tocar en los shows de vídeo/ocultar la barra de control

Para la primera parte es fácil de arreglar cambiando el valor de tiempo de espera predeterminado de inicio a cero (cero significa indefinido, se usa internamente cuando se inicia el video) así:

mediaController = new MediaController(this){ 
      @Override 
      public void show() { 
       super.show(0);//Default no auto hide timeout 
      } 
    }; 

El segundo problema es un poco complicado porque el manejador de clics se declara como privado y final, por lo que no tenemos ningún control sobre eso. Mi solución es utilizar otra función para establecer la visibilidad y desactivar la función de ocultar así:

mediaController = new MediaController(this){ 

      @Override 
      public void show() { 
       super.show(0);//Default no auto hide timeout 
      } 
      @Override 
      public void hide() { 
        //DOES NOTHING 
      } 

      void setVisible(boolean visible){//USE THIS FUNCTION INSTEAD 
       if(visible) 
        super.show(); 
       else 
        super.hide(); 
      } 
    }; 

También puede agregar una variable para volver a habilitar la funcionalidad estándar si la visibilidad se establece en false, así:

mediaController = new MediaController(this){ 
       private boolean forceVisible=false; 

       @Override 
       public void show() { 
        super.show(0);//Default no auto hide timeout 
       } 
       @Override 
       public void hide() { 
        if(!forceVisible)super.hide(); 
       } 

       void setVisible(boolean visible){ 
        forceVisible=visible; 
        if(visible) 
         super.show(); 
        else 
         super.hide(); 
       } 
     }; 
Cuestiones relacionadas