2011-07-11 15 views
5

Tengo problemas para encontrar la forma de mantener el MediaController en la pantalla cuando lo utilizo con VideoView. Quiero reproducir un archivo de audio que se encuentra en res/raw en mi aplicación. El archivo se está reproduciendo pero me gustaría mantener el controlador en la pantalla para que el usuario vea la longitud del archivo y cuánto tiempo queda antes del final, etc. Encontré mucho tiempo en los foros en los que deberíamos usar el método. (hora) para hacer eso, pero no puedo encontrar la manera de hacerlo funcionar.Mantener MediaController en la pantalla en VideoView

Aquí está el código que estoy utilizando:

package com.sample.VideoViewExample; 
import android.app.Activity; 
import android.net.Uri; 
import android.os.Bundle; 
import android.view.SurfaceHolder; 
import android.widget.MediaController; 
import android.widget.VideoView; 

public class VideoViewExample extends Activity implements SurfaceHolder.Callback{ 
    private VideoView mVideoView; 
    private MediaController mMedia; 

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

    mVideoView = (VideoView) findViewById(R.id.surface_view); 
    //mVideoView.getHolder().addCallback(this); 
    //mMedia.show(50000); 
    //mVideoView.setMediaController(mMedia); 

    MediaController mMedia = new MediaController(this); 
    mMedia.setMediaPlayer(mVideoView); 
    mMedia.setAnchorView(mVideoView); 
    mVideoView.setMediaController(mMedia); 

    mVideoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() +"/"+R.raw.osa_patient)); 

    mVideoView.requestFocus(); 
    mVideoView.start(); 

    } 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
    mMedia.show(500000); 

} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 

} 
} 

Cuando agrego la línea mVideoView.getHolder() addCallback (este);. el error de la aplicación, no estoy seguro de por qué.

Cualquier ayuda o alternativa a lo que me gustaría hacer es más que bienvenido :)

Gracias, JB

+0

¿Está diciendo que VideoView también reproducirá archivos de audio? –

Respuesta

4

Ok he encontrado! ¡¡Después de pasar horas allí !! Por lo tanto, no tengo conocimiento de cómo hacerlo en los diferentes foros. Aquí es un truco que encontré:

primera clase (ejemplo ...)

package com.sample.VideoViewExample; 
import android.app.Activity; 
import android.net.Uri; 
import android.os.Bundle; 
import android.view.SurfaceHolder; 
import android.view.Window; 
import android.view.WindowManager; 
import android.widget.VideoView; 

public class VideoViewExample extends Activity implements SurfaceHolder.Callback{ 
    private VideoView mVideoView; 


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

    mVideoView = (VideoView) findViewById(R.id.surface_view);  
    mVideoView.setKeepScreenOn(true); 

     Window window = getWindow(); 
     window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

    SurfaceHolder holder = mVideoView.getHolder(); 
    holder.addCallback(this);  
    MediaController_2 mMedia = new MediaController_2(this); 

    mMedia.setMediaPlayer(mVideoView); 
    mMedia.setAnchorView(mVideoView);  
    mVideoView.setMediaController(mMedia); 
    mVideoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() +"/"+R.raw.osa_patient));  
    mVideoView.requestFocus(); 
    mVideoView.start(); 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 

} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 

} 
} 

SEGUNDA CLASE (con el truco de)

package com.sample.VideoViewExample; 

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

public class MediaController_2 extends MediaController{ 


    public MediaController_2(Context context) { 
     super(context); 

     // TODO Auto-generated constructor stub 
    } 

    public void hide() { 
    } 

} 

el truco es sólo para crear un nuevo MediaController que extiende Mediacontroller y cuya función hide() no hace nada!

Si usted quiere tener un vistazo al código fuente MediaController para una mejor comprensión, se puede ver aquí: // código fuente para MediaController http://hi-android.info/src/android/widget/MediaController.java.html

Esperamos que esto sea de ayuda a SB, JB

+3

Extender el controlador de medios y anular el método oculto Deshabilitar la pantalla completa y no se puede detectar ningún evento táctil de una actividad excepto los controles del controlador multimedia. – SALMAN

+0

@SALMAN Sí, eso es correcto, pero ¿hay alguna solución para ello? –

12

esto funcionó para mí. Simplemente extienda la clase de controlador de medios. Y anula el método hide.

MediaController mediaController = new MyMediaController(this, true); 

public class MyMediaController extends MediaController { 

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

    @Override 
    public void hide() { 
     mediaController.show(0); 
    } 

} 
+0

pero evita que regrese a la aplicación. –

0

De las respuestas dadas hasta ahora, ahora el problema es que la funcionalidad de volver no funcionará, por lo que para solucionarlo, siga este código.

public class CustomMediaController extends MediaController { 


public CustomMediaController(Context context) { 
    super(context); 

    // TODO Auto-generated constructor stub 
} 


public void hide() { 

} 

// necesario para hacer que la funcionalidad de volver a trabajar

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 

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

     super.hide(); 
     Activity activity = (Activity)getContext(); 
     activity.finish(); 

    } 
    return super.dispatchKeyEvent(event); 
}} 
0

Todo lo que tiene que hacer es reemplazar el MediaController con su propia clase y luego anular el onTouchEvent.

public class SmartLinkVideoController extends MediaController implements MediaPlayerControl { 

//declare needed variables 
private SmartLinkVideoPlayer mVideoPlayer; 

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

public SmartLinkVideoController(Context context, SmartLinkVideoPlayer videoPlayer) { 
    this(context); 
    this.setMediaPlayer(this); 
    this.mVideoPlayer = videoPlayer; 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    //super implementation sets default time to hide of ~ 3 seconds 
    show(0); 
    return true; 
} 

@Override 
public void start() { 
    mVideoPlayer.start(); 
} 

@Override 
public void pause() { 
    mVideoPlayer.pause(); 
} 

@Override 
public int getDuration() { 
    return mVideoPlayer.getDuration(); 
} 

@Override 
public int getCurrentPosition() { 
    return mVideoPlayer.getCurrentPosition(); 
} 

@Override 
public void seekTo(int pos) { 
    mVideoPlayer.seekTo(pos); 
} 

@Override 
public boolean isPlaying() { 
    return mVideoPlayer.isPlaying(); 
} 

@Override 
public int getBufferPercentage() { 
    return mVideoPlayer.getPercentBuffered(); 
} 

@Override 
public boolean canPause() { 
    return true; 
} 

@Override 
public boolean canSeekBackward() { 
    return true; 
} 

@Override 
public boolean canSeekForward() { 
    return true; 
} 

@Override 
public int getAudioSessionId() { 
    return 0; 
} 

public boolean hasVideoPlayer() { 
    return (mVideoPlayer != null); 
} 

public void prepareVideo() { 
    if(mVideoPlayer.getVideoType() == SmartLinkVideoPlayer.VIDEO_TYPE_INTERNAL 
      || mVideoPlayer.getVideoType() == SmartLinkVideoPlayer.VIDEO_TYPE_EXPANSION) 
     mVideoPlayer.prepare(); 
    else 
     mVideoPlayer.prepareAsync(); 
} 

public void prepareSurface(SurfaceHolder holder) { 
    mVideoPlayer.setDisplay(holder); 
} 

public void rewindVideo() { 
    mVideoPlayer.seekTo(0); 
} 

public void setVideoPlayer(SmartLinkVideoPlayer videoPlayer) { 
    mVideoPlayer = videoPlayer; 
} 

public void stopVideoPlayer() { 
    mVideoPlayer.stop(); 
} 

public void resetVideoPlayer() { 
    mVideoPlayer.reset(); 
} 

public void releaseVideoPlayer() { 
    mVideoPlayer.release(); 
    mVideoPlayer = null; 
} 
} 
Cuestiones relacionadas